我有一个带有标题值的示例csv文件:Fruit,Size,Color:
Fruit Size Color
Apple 5 Red
Apple 6 Green
Pear 4 Green
我想创建一个字典,在那里我可以查找'Fruit'并获得'Size'和'Color'。
我的代码:
import csv
new_dict = {}
with open('data.csv', 'rb') as f:
reader = csv.reader(f)
for row in reader:
if row[0] in new_dict:
new_dict[row[0]].append(row[1:])
else:
new_dict[row[0]] = row[1:]
print new_dict
我打算在打印new_dict时看到的输出是:
{'Apple': ['5', 'Red'],['6', 'Green'], 'Pear': ['4', 'Green'] }
或者可能(不确定如何使用相同键的多个值)
{'Apple': [['5', 'Red'],['6', 'Green']], 'Pear': ['4', 'Green'] }
但我实际得到的是:
{'Apple': ['5', 'Red', ['6', 'Green']], 'Pear': ['4', 'Green'] }
问题是['5', 'Red', ['6', 'Green']]
,其中要添加的第二个Apple项目位于第一个Apple项目列表中。
基本上,我希望能够键入:new_dict["Apple"]
并使用“Apple”键返回所有列表。
那么如何正确构建我的字典以包含具有相同键的多个值?并避免将其他值放入为该键添加的第一个值的列表中? (在这种情况下为“Apple”)
答案 0 :(得分:2)
由于您的数据点成对出现,因此您需要将它们保持在列表中。这解决了这个问题:
new_dict[row[0]] = row[1:]
更改为new_dict[row[0]] = [row[1:]]
这将产生:
{'Apple': [['5', 'Red'], ['6', 'Green']], 'Pear': [['4', 'Green']] }
或者,您可以将它们设置为更适合您的问题的元组,因为它们是固定大小的:
.append(tuple(row[1:]))
和new_dict[row[0]] = [tuple(row[1:])]
这将产生:
{'Apple': [('5', 'Red'), ('6', 'Green')], 'Pear': [('4', 'Green')] }