Skip to main content
 首页 » 编程设计

python之用不同数量的字典保存嵌套字典

2025年05月04日14mayingbao

我有一个字典的字典,但每个键都有不同数量的字典作为值。此外,嵌套字典的键可以采用三种不同的形式。

myDict = { 
    u'A': {'1998': u'ATLANTA'}, 
    u'B': {'1999': u'MANNHEIM'}, 
    u'C': {'2000': u'BERLIN'}, 
    u'D': {'1998': u'CHICAGO', '1999': u'PRINCETON'}, 
    u'E': {'2000': u'LOUISIANA'}, 
    u'F': {'1998': u'NEW YORK', '1999': u'NEW YORK'} 
} 

我想把 myDict 写成一个看起来像这样的表格

  | 1998     | 1999     | 2000 
A | ATLANTA  |          | 
B |          | MANNHEIM | 
C |          |          | BERLIN 
D |          | CHICAGO  | PRINCETON 
E |          |          | LOUISANA 
F | NEW YORK | NEW YORK | 

我该怎么做?我尝试使用来自 csv 的 DictWriter 和 Writer,但两者都不起作用:

DictWriter:

import csv 
 
with open("outfilename.csv", 'w') as f: 
    fieldnames = ['author', '1998', '1999', '2000'] 
    csvWriter = csv.DictWriter(f, fieldnames) 
    csvWriter.writerows(myDict) 

结果:

  File "./011_create_node_lists.py", line 122, in <module> 
    csvWriter.writerows(myDict) 
  File "/usr/lib/python2.7/csv.py", line 157, in writerows 
    rows.append(self._dict_to_list(rowdict)) 
  File "/usr/lib/python2.7/csv.py", line 149, in _dict_to_list 
    return [rowdict.get(key, self.restval) for key in self.fieldnames] 
AttributeError: 'unicode' object has no attribute 'get' 

作者:

import csv 
 
with open("outfilename.csv", 'w') as f: 
    csvWriter = csv.writer(f) 
    for key, value in myDict.items(): 
       csvWriter.writerow([key, value]) 

结果:

A | {'1998': u'ATLANTA'} 
B | {'1999': u'MANNHEIM'} 
C | {'2000': u'BERLIN'} 
D | {'1998': u'CHICAGO'    | '1999': u'PRINCETON'} 
E | {'2000': u'LOUISIANA'} 
F | {'1998': u'NEW YORK'   | '1999': u'NEW YORK'} 

此外,我什至不确定这是否是打印结构化表格的最佳方式。

请您参考如下方法:

A DictWriter's writerows 方法需要一个字典列表,这样它就可以遍历列表以获取每个字典并从中创建一个 CSV 行(这是由 完成的) _dict_to_list,根据你的回溯)。如果你传递给它字典的字典,那么当你遍历它时你会得到每个键,它不能从中创建行(它是unicode,而不是 dict,所以 _dict_to_list 会卡住)。因此,您需要将字典的字典处理成字典列表,确保每个字典都有适当的键。

例如:

rows = [dict(author=author, **data) for author, data in myDict.items()] 

(如果不熟悉此语法的任何部分,请参见例如 Python for-in loop preceded by a variable 和 What does ** (double star) and * (star) do for parameters?)

根据您的输入,这给了我:

[{'1998': u'ATLANTA', 'author': u'A'},  
 {'2000': u'BERLIN', 'author': u'C'},  
 {'1999': u'MANNHEIM', 'author': u'B'},  
 {'2000': u'LOUISIANA', 'author': u'E'},  
 {'1999': u'PRINCETON', '1998': u'CHICAGO', 'author': u'D'},  
 {'1999': u'NEW YORK', '1998': u'NEW YORK', 'author': u'F'}] 

请注意,顺序可能会有所不同,因为字典无序(除非您使用例如 [... in sorted(myDict.items())],用于字母顺序按作者排序)。