这应该是一个简单的,但因为我不熟悉python,我还没有弄清楚它是如何工作的。 我有以下csv文件
name ; type
apple ; fruit
pear ; fruit
cucumber ; vegetable
cherry ; fruit
green beans ; vegetable
我想要实现的是列出所有不同类型及其相应的名称,例如:
fruit: apple, pear, cherry
vegetable: cucumber, green beans
用csv.DictReader读取它我可以生成该csv文件的字典列表,保存在变量alldata中。
alldata =
[
{'name':'apple', 'type':'fruit'},
{'name':'pear', 'type':'fruit'},
...
]
现在我需要一个来自alldata
的所有不同类型值的列表types = ??? #it should contain [fruit, vegetable]
这样我可以遍历列表并提取与这些类型相对应的名称:
foreach type in types
list_of_names = ??? #extract all values of alldata["type"]==type and put them in a new list
print type + ': ' + list_of_names
有人知道,如何实现这个目标?
答案 0 :(得分:2)
您可以使用列表推导来解决此问题:
types = set([data['type'] for data in alldata])
list_of_name = [data['name'] for data in alldata if data['type']==type]
答案 1 :(得分:1)
使用set
结构:
types = set((d['type'] for d in alldata))
答案 2 :(得分:1)
更通用的方法是使用itertools.groupby:
from itertools import groupby
food = [
{'name': 'apple', 'type': 'fruit'},
{'name': 'pear', 'type': 'fruit'},
{'name': 'parrot', 'type': 'vegetable'}]
for group, items in groupby(sorted(food, key=lambda x: x['type']), lambda x: x['type']):
print group, list(items) # here is group and items' objects in the group
结果是:
fruit [{'type': 'fruit', 'name': 'apple'}, {'type': 'fruit', 'name': 'pear'}]
vegetable [{'type': 'vegetable', 'name': 'parrot'}]
UPD :在groupby之前排序dict。谢谢@mgilson的观点!
创建一个迭代器,从迭代中返回连续的键和组。关键是计算每个元素的键值的函数。如果未指定或为None,则键默认为标识函数并返回元素不变。 通常,迭代需要已经在相同的键函数上排序。
https://docs.python.org/2/library/itertools.html#itertools.groupby