假设我有以下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'])
但是,我不喜欢循环使用项目,并且正在寻找一种更好的方法来实现这一目标。
答案 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]