我有list
dicts
,如此:
a = [ {'list':[1,2,3]}, {'list':[1,4,5]} ]
我试图在list
键中获取一组平面值,例如{1,2,3,4,5}
。什么是最快的方式?
答案 0 :(得分:3)
您可以编写一个循环:
result = set()
for row in a:
result.update(row['list'])
我认为它会合理地运作。
或者你可以简单地使用 set comprehension ,这将产生以下 one-liner :
result = {x for row in a for x in row['list']}
如果并非所有元素都包含'list'
键,则可以将.get(..)
与空元组一起使用(这将减少构建时间):
result = {x for row in a for x in row.get('list',())}
答案 1 :(得分:3)
目前尚不清楚你对“最快”的定义是什么,但无论是速度还是行数我都会使用itertools和生成器的组合。
>>> import itertools
>>> a = [ {'list':[1,2,3]}, {'list':[1,4,5]} ]
>>> b = set(itertools.chain.from_iterable(x['list'] for x in a if 'list' in x))
请注意,我已针对可能不包含'list'
键的任何元素添加了警示;你可以省略,如果你知道这将永远是真的。
答案 2 :(得分:1)
reduce
轻松创建您需要使用初始化器-reduce
函数中的第三个参数。
reduce(
lambda _set, _dict, key='list': _set.update(
_dict.get(key) or set()) or _set,
a,
set())
以上代码适用于python2和python3,但是您需要将reduce模块导入为from functools import reduce
。有关详细信息,请参见下面的链接。