2013-02-10 170 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