2014-12-02 53 views
0

如果我有一个字典列表,是否有一种方法可以引用for循环声明中的特定元素?参考'for'循环中的字典元素

事情是这样的:

dict_lst = [ 
    {'a': 1, 'b': 2, 'c': 3}, 
    {'a': 1, 'b': 2, 'c': 3}, 
    {'a': 1, 'b': 2, 'c': 3}, 
] 

for d['a'] as dict_elem in dict_lst: 
    print dict_elem 

或类似的东西?

回答

3

没有,有在for声明没有as条款。

但它很容易进行明确地做到这一点:

for d in dict_lst: 
    dict_elem = d['a'] 
    print dict_elem 

或者更简单地说:

for d in dict_list: 
    print d['a'] 

或者,如果你想获得幻想:

for dict_elem in (d['a'] for d in dict_lst): 
    print dict_elem 

或者,只是为了好玩:

for dict_elem in map(operator.itemgetter('a'), dict_lst): 
    print dict_elem 

,你可以包一个可重复使用的功能:

def itemmap(dicts, key): 
    for item in dicts: 
     yield item[key] 

for dict_elem in itemmap(dict_lst, 'a'): 
    print dict_elem 

作为一个侧面说明,你其实可以做for d['a'] in dict_list:,但只是重新分配d['a'](假设d已经是一个字典),以每个新字典在列表中,这通常是一个令人困惑的事情。 (它可以是混淆代码比赛有用...)

+0

很酷。我推迟了一段时间了解发电机 - 猜猜是时候了解它们! – vincent 2014-12-02 21:47:50

+1

@vincent:这是官方教程中较好的部分之一(请参阅[List Comprehensions](https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions),如果你不了解他们,然后从[Iterators](https://docs.python.org/2/tutorial/classes.html#iterators)开始阅读该章的其余部分,然后,一旦您掌握了基本知识,请参阅[ David Beazley的介绍](http://www.dabeaz.com/generators-uk/)。 – abarnert 2014-12-02 21:59:34

2

可以使用generator expression像这样:

>>> dict_lst = [ 
... {'a': 1, 'b': 2, 'c': 3}, 
... {'a': 1, 'b': 2, 'c': 3}, 
... {'a': 1, 'b': 2, 'c': 3}, 
... ] 
>>> for dict_elem in (d['a'] for d in dict_lst): 
...  dict_elem 
... 
1 
1 
1 
>>> 
0

您可以使用此:

for element in dict_lst: 
    print element['some_key'] 
+0

我想你的意思是'dict_lst [元素]' – 2014-12-02 22:23:22

+0

@FarmerJoe我没有注意到 – Andres 2014-12-02 23:28:54

+0

你仍然有错。应该是'dict_lst [element]'。当你为'some_dictionary中的元素:'时,你正在遍历这些键。 – 2014-12-02 23:50:09

0

这是最快的国家之一和Python的方法来做到这一点,瘦关于Python 3:

for key, val in d.iteritems(): 
    print key, val 

也有类似的方法items,它几乎相同。如果在for循环语句中调用它,items将创建一个包含键和值的元组列表。还有一种类似的方法keys,它只返回一个键列表。

iteritems在for循环中调用它时不会生成元组列表。 Each element will be evaluated in each loop cycle.所以没有初始开销和大量的内存使用。如果你打破这个循环,它也会更好。