用不同数量的字典保存嵌套字典
Save nested dictionary with differing number of dictionaries
我有一个字典的字典,但每个键都有不同数量的字典作为值。此外,嵌套字典的键可以采用三种不同的形式。
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
写成 table 看起来像
| 1998 | 1999 | 2000
A | ATLANTA | |
B | | MANNHEIM |
C | | | BERLIN
D | | CHICAGO | PRINCETON
E | | | LOUISANA
F | NEW YORK | NEW YORK |
我该怎么做?我尝试使用 DictWriter
和 csv
中的 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'
writer
:
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'}
此外,我什至不确定这是否是打印结构化文件的最佳方式 table。
csv.DictWriter.writerows
采用字典列表,而不是字典的字典。您需要向内部字典添加一个 author
键。
所以:
csvWriter.writerows(
dict(data.items() + [('author', author)])
for author, data in author_aff_dict.items()
)
或更详细地说:
author_rows = []
for author, data in author_aff_dict.items():
row = {'author': author}
row.update(data)
author_rows.append(row)
csvWriter.writerows(author_rows)
您可能还想从 writeheader()
电话开始
一个DictWriter
'swriterows
方法需要一个字典列表,这样它就可以遍历列表以获取每个字典并创建一个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 and 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())]
,按字母顺序 author
)。
我有一个字典的字典,但每个键都有不同数量的字典作为值。此外,嵌套字典的键可以采用三种不同的形式。
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
写成 table 看起来像
| 1998 | 1999 | 2000
A | ATLANTA | |
B | | MANNHEIM |
C | | | BERLIN
D | | CHICAGO | PRINCETON
E | | | LOUISANA
F | NEW YORK | NEW YORK |
我该怎么做?我尝试使用 DictWriter
和 csv
中的 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'
writer
:
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'}
此外,我什至不确定这是否是打印结构化文件的最佳方式 table。
csv.DictWriter.writerows
采用字典列表,而不是字典的字典。您需要向内部字典添加一个 author
键。
所以:
csvWriter.writerows(
dict(data.items() + [('author', author)])
for author, data in author_aff_dict.items()
)
或更详细地说:
author_rows = []
for author, data in author_aff_dict.items():
row = {'author': author}
row.update(data)
author_rows.append(row)
csvWriter.writerows(author_rows)
您可能还想从 writeheader()
电话开始
一个DictWriter
'swriterows
方法需要一个字典列表,这样它就可以遍历列表以获取每个字典并创建一个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 and 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())]
,按字母顺序 author
)。