2014-12-02 55 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.所以沒有初始開銷和大量的內存使用。如果你打破這個循環,它也會更好。