2012-02-05 156 views
19

我有一个列表-myList - 其中每个元素是一个字典。我希望遍历这个列表,但是我只对每个字典中的一个属性 - “年龄”有兴趣。我也有兴趣保持迭代次数。迭代字典列表

我做的:

for i, entry in enumerate(myList): 
    print i; 
    print entry['age']; 

,但不知道是有什么更Python。有小费吗?

+1

的列表取决于你想用它做什么。如果你想要做的就是打印它,这很好。如果你想用一些年龄函数(比如max)创建一个新列表,你可以使用listcomp或者genexp。但是如果你想在入门['age']上进行大量分支,请使用for循环。 [你可以跳过分号..] – DSM 2012-02-05 19:55:15

回答

22

你可以使用一个发电机来只抢老年。

# Get a dictionary 
myList = [{'age':x} for x in range(1,10)] 

# Enumerate ages 
for i, age in enumerate(d['age'] for d in myList): 
    print i,age 

而且,是的,不要使用分号。

4

对于印刷,您可能正在做的是正确的。但是,如果要存储的值,您可以使用列表理解:

>>> d_list = [dict((('age', x), ('foo', 1))) for x in range(10)] 
>>> d_list 
[{'age': 0, 'foo': 1}, {'age': 1, 'foo': 1}, {'age': 2, 'foo': 1}, {'age': 3, 'foo': 1}, {'age': 4, 'foo': 1}, {'age': 5, 'foo': 1}, {'age': 6, 'foo': 1}, {'age': 7, 'foo': 1}, {'age': 8, 'foo': 1}, {'age': 9, 'foo': 1}] 
>>> ages = [d['age'] for d in d_list] 
>>> ages 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> len(ages) 
10 
2

在线路末端的分号是没有必要在Python(但如果你想要把多个语句,你可以使用它们同一条线)。所以省略它们会更麻烦些。

但实际的迭代策略很容易遵循,并且相当明确地表明您正在做什么。有其他方式来做到这一点。但是明确的for循环完全是pythonic。

(尼克拉斯·B.的回答不会做正是你在做什么:如果你想要做这样的事情,格式字符串应该是"{0}\n{1}"。)

14

很简单的办法,字典迭代

>>> my_list 
[{'age': 0, 'name': 'A'}, {'age': 1, 'name': 'B'}, {'age': 2, 'name': 'C'}, {'age': 3, 'name': 'D'}, {'age': 4, 'name': 'E'}, {'age': 5, 'name': 'F'}] 

>>> ages = [li['age'] for li in my_list] 

>>> ages 
[0, 1, 2, 3, 4, 5]