使用字典列表的一个键创建列表

时间:2014-08-29 13:09:02

标签: python list dictionary

这应该是一个简单的,但因为我不熟悉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

有人知道,如何实现这个目标?

3 个答案:

答案 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