2013-02-10 223 views
1

說我有類型的字典列表,看起來像這樣:如何獲得列表中所有密鑰的密鑰列表?

[{1: "a"}, {2: "b"}] 

我怎樣才能獲得所列出的類型的字典所有關鍵字的列表(意爲[1,2])?

+0

每本字典只有一個條目嗎?如果是這樣,你最好將數據存儲爲'{1:'a',2:'b'}'或'[(1,'a'),(2,'b')]' – Eric 2013-02-10 15:55:58

回答

7

您可以使用chain.from_iterable

>>> from itertools import chain 
>>> l = [{1: "a"}, {2: "b"}] 
>>> list(chain.from_iterable(l)) 
[1, 2] 

或者,如果你用一個列表理解,你可以跳過.keys()。在python 2.x中,您還可以避免用這種方式構建不必要的列表:

>>> [k for d in l for k in d] 
[1, 2] 
1

如果使用以下代碼,則不需要導入任何內容。

>>> map(lambda x: x.keys()[0], [{1: "a"}, {2: "b"}]) 
[1, 2] 

雖然它不乾淨......

+0

只能在一個鍵的情況下工作,但是。 – DSM 2013-02-10 15:55:50

4

如果你想避免額外的輸入,你可以用一個列表理解:

>>> l = [{1: 'a'}, {2: 'b'}] 
>>> [k for d in l for k in d.keys()] 
[1, 2] 
0

非常簡單的方法(不導入任何東西) :

d = [{1: "a"}, {2: "b"}] 
keys = [l.keys() for l in d] 

但是,這返回[[1], [2]]

爲了避免這種情況,你可以將其更改爲:

d = [{1: "a"}, {2: "b"}] 
keys = [] 
for l in d: 
    for key in l: # iterating through a dictionary always gives the key 
     keys.append(key) 

list-comprehension相當於上面是:

d = [{1: "a"}, {2: "b"}] 
keys = [key for l in d for key in l.keys()] 

您還可以使用built-in d.update(d2) feature,它結合了字典:

d = [{1: "a"}, {2: "b"}] 
new_dict = {} 
for l in d: new_dict.update(l) 
new_dict.keys() 

這會覆蓋其中一個鍵值對,如果t字典有兩個相同的密鑰(如[{1: 'a'}, {1: 'b'}])。

0

如果你想有一個列表,如果你想一套sum((m.keys() for m in l), [])

set(sum((m.keys() for m in l), []))

+2

儘管這樣做會起作用,但它會顯示二次方行爲(如果列表長度延長十倍,則執行總和的時間會延長100倍)。 – DSM 2013-02-10 16:06:12