【问题标题】:Save nested dictionary with differing number of dictionaries使用不同数量的字典保存嵌套字典
【发布时间】:2015-06-28 14:17:52
【问题描述】:

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

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 |

我该怎么做?我尝试使用来自csvDictWriterWriter,但两者都不起作用:

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'}

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

【问题讨论】:

    标签: python csv dictionary structured-data


    【解决方案1】:

    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() 电话开始

    【讨论】:

    • 第二部分输出文件不正确,第一部分未定义数据
    • @heinst:你错过了一个编辑——我觉得第一部分是正确的。第二个输出有什么问题?
    【解决方案2】:

    DictWriter'swriterows 方法需要 字典列表,以便它可以遍历列表以获取每个字典并从中创建一个 CSV 行(这是由 @ 完成的987654326@,根据您的回溯)。如果您将字典字典传递给它,那么当您对其进行迭代时,您会得到每个键,它无法从中创建一行(它是unicode,而不是dict,所以 _dict_to_list 扼流圈)。因此,您需要将您的字典字典处理成字典列表,确保每个字典都有适当的键。

    例如:

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

    (如果不熟悉此语法的任何部分,请参阅例如 Python for-in loop preceded by a variableWhat 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 的字母顺序)。

    【讨论】:

      猜你喜欢
      • 2012-11-03
      • 2021-12-20
      • 2019-05-27
      • 1970-01-01
      • 2021-07-24
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多