Python:将元组写成 DictWriter 的行的最简洁方法?

Python: Cleanest way to write tuples as rows of a DictWriter?

鉴于:

with open('results.csv', 'wb') as csvfile:
    fieldnames = ['Name', 'Address', '#Reviews']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow(row)

还有一个元组列表,每个元组都包含姓名、地址和#review,例如

[('Name2', 'Main St', 2), ('Name2', 'The Hill', 7), ('Name1', 'The Square', 14)]

我正在尝试使用 writer.writerow() 将每个元组写成 csv 中的一行。我可以为每个元组创建一个字典,因此:

In [95]: for tup in z:
   ....:     row = {"Name": tup[0], "Address": tup[1], "#Reviews": tup[2]}
   ....:     print row

但是 (i) 它很复杂,更重要的是 (ii) 顺序在 dict 创建中丢失,顺序将与 fieldnames 的顺序不匹配。

我可以使用 OrderedDict(),但这又显得有点令人费解。

实现此目标的 neater/shorter 方法是什么?

您可以使用 zip:

data = [('Name2', 'Main St', 2), ('Name2', 'The Hill', 7), ('Name1', 'The Square', 14)]
for entry in data:
    row = dict(zip(fieldnames, entry))
    print(row)

这将创建可以传递给 csv.DictWriter:

的适当词典
>>> fieldnames = ['Name', 'Address', '#Reviews']
>>> for entry in data:
...     row = dict(zip(fieldnames, entry))
...     print(row)
...
{'Name': 'Name2', '#Reviews': 2, 'Address': 'Main St'}
{'Name': 'Name2', '#Reviews': 7, 'Address': 'The Hill'}
{'Name': 'Name1', '#Reviews': 14, 'Address': 'The Square'}

如果您的数据未被格式化为 dict,您为什么要使用 DictWriter?只需使用正常的 csv.writer:

with open('results.csv', 'wb') as csvfile:
    fieldnames = ['Name', 'Address', '#Reviews']
    writer = csv.writer(csvfile)
    writer.writerow(fieldnames)
    writer.writerows(z) # z is a list of all rows to write

更简单、更快且代码更少。