提取列表中嵌入的字典项

时间:2017-09-27 12:46:32

标签: python list dictionary

假设我有以下dict列表

t = [{'a': 1.0, 'b': 2.0},
     {'a': 3.0, 'b': 4.0},
     {'a': 5.0, 'b': 6.0},
     {'a': 7.0, 'b': 9.0},
     {'a': 9.0, 'b': 0.0}]

是否有一种有效的方法来提取字典键值为a的词典中包含的所有值?

到目前为止,我已经提出了以下解决方案

x = []
for j in t:
    x.append(j['a'])

但是,我不喜欢循环使用项目,并且正在寻找一种更好的方法来实现这一目标。

3 个答案:

答案 0 :(得分:8)

您可以使用列表理解:

t = [{'a': 1.0, 'b': 2.0},
 {'a': 3.0, 'b': 4.0},
 {'a': 5.0, 'b': 6.0},
 {'a': 7.0, 'b': 9.0},
 {'a': 9.0, 'b': 0.0}]
new_list = [i["a"] for i in t]

输出:

[1.0, 3.0, 5.0, 7.0, 9.0]

由于此解决方案使用for循环,因此您可以使用map代替:

x = list(map(lambda x: x["a"], t))

输出:

[1.0, 3.0, 5.0, 7.0, 9.0]

在性能方面,您更喜欢使用list-comprehension解决方案而不是map one。

>>> timeit('new_list = [i["a"] for i in t]', setup='from __main__ import t', number=10000000)
4.318223718035199

>>> timeit('x = list(map(lambda x: x["a"], t))', setup='from __main__ import t', number=10000000)
16.243124993163093


def temp(p):
    return p['a']

>>> timeit('x = list(map(temp, t))', setup='from __main__ import t, temp', number=10000000)
16.048683850689343

使用lambda或常规函数时略有不同;然而,理解执行需要1/4的时间。

答案 1 :(得分:2)

您可以使用itemgetter

from operator import itemgetter

t = [{'a': 1.0, 'b': 2.0},
     {'a': 3.0, 'b': 4.0},
     {'a': 5.0, 'b': 6.0},
     {'a': 7.0, 'b': 9.0},
     {'a': 9.0, 'b': 0.0}]

print map(itemgetter('a'), t)

结果:

[1.0, 3.0, 5.0, 7.0, 9.0]

答案 2 :(得分:0)

使用Ajax1234'a回答中建议的列表推导,或者甚至是生成器表达式,如果这样做有利于您的用例:

t = [{'a': 1.0, 'b': 2.0}, {'a': 3.0, 'b': 4.0}, {'a': 5.0, 'b': 6.0}, {'a': 7.0, 'b': 9.0}, {'a': 9.0, 'b': 0.0}]
x = (item["a"] for item in t)
print(x)

输出:

<generator object <genexpr> at 0x7f0027def550>

生成器的优点是在需要值之前不执行或消耗内存。使用next()从生成器中获取下一个项目,或者使用for循环迭代它。

>>> next(x)
1.0
>>> next(x)
3.0
>>> for n in x:
...     print(n)
5.0
7.0
9.0

另一种方法是使用pandas

,尽管价格昂贵
import pandas as pd

x = pd.DataFrame(t)['a'].tolist()
print(x)

输出:

[1.0, 3.0, 5.0, 7.0, 9.0]