从嵌入在列表中的字典项中提取信息

9

假设我有以下字典列表:

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个回答

21
您可以使用列表推导式:
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]

从性能角度考虑,你更倾向于使用列表解析方案而不是映射方案。

>>> 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。

“map”解决方案非常好,它比推导更可取吗? - Chen A.
list(map ...) + lambda 不如使用推导式。当你需要在 map 中使用 lambda 时,更好的选择是使用推导式。 - Jean-François Fabre
@Ajax1234 明白了。每次迭代定义一个函数的开销是缺点。您认为如果我们改用常规函数,两者在效率上是否相等? - Chen A.
@Vinny,使用常规函数(即 def something(): pass)的 map 实际上比列表推导式更快,因为函数 something 已经预先声明。 - Ajax1234
@Ajax1234 我已经测试过了,显然理解解决方案胜出了很多。 - Chen A.
显示剩余4条评论

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]

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接