我有以下词典:
d = {'a': set([1,2,3]), 'b': set([3,4,5])}
我如何获得一组唯一值,即set([1,2,3,4,5])
到目前为止,我有:
all_values = set([])
for item in d.values():
all_values = all_values.union(item)
>>> all_values
set([1, 2, 3, 4, 5])
有没有办法在一行中做到这一点?
答案 0 :(得分:4)
您可以将dict.values()
解压缩到set.union()
。示例 -
>>> d = {'a': set([1,2,3]), 'b': set([3,4,5])}
>>>
>>> set.union(*d.values())
{1, 2, 3, 4, 5}
答案 1 :(得分:1)
您可以使用列表理解。
>>> d = {'a': set([1,2,3]), 'b': set([3,4,5])}
>>> set([j for i in d.values() for j in i])
{1, 2, 3, 4, 5}
答案 2 :(得分:0)
停止过度思考后,下面的解决方案是显而易见的,最短的(20个字符)和最快的436ns:
d['a'].union(d['b'])
Out[62]: {1, 2, 3, 4, 5}
itertools.chain.from_iterable展平嵌套的iterable并且表现非常好,所以一种方法是:
from itertools import chain
set(chain.from_iterable(d.values()))
Out[20]: {1, 2, 3, 4, 5}
reduce(func,seq)连续将函数func应用于序列seq,将结果累加到单个值中,因此如果func(x,y)是x.union(y)并且seq是设置列表的结果将是他们的联盟。将func(x,y)表示为lambda并使用Python 2.7,因此无需导入functools:
reduce(lambda x,y: x.union(y), d.values())
Out[21]: {1, 2, 3, 4, 5}
使用Python 3.4.3,从functools导入后,同样的reduce函数可以工作:
import sys
sys.version
Out[6]: '3.4.3 |Anaconda 2.3.0 (64-bit)| (default, Mar 6 2015, 12:06:10) [MSC v.1600 64 bit (AMD64)]'
from functools import reduce
reduce(lambda x,y: x.union(y), d.values())
Out[8]: {1, 2, 3, 4, 5}
%timeit性能比较使用Python 2.7.10显示d ['a']。union(d ['b'])最快,其次是set.union(* d.values()),set(链。 from_iterable(d.values())),reduce(lambda x,y:x.union(y),d.values())和set([j for i in d.values()in j in i])。以下是按执行时间增加的顺序结果:
%timeit d['a'].union(d['b'])
1000000 loops, best of 3: 436 ns per loop
%timeit set.union(*d.values())
1000000 loops, best of 3: 763 ns per loop
%timeit set().union(*d.values())
1000000 loops, best of 3: 828 ns per loop
%timeit set(chain.from_iterable(d.values()))
1000000 loops, best of 3: 917 ns per loop
%timeit reduce(lambda x,y: x.union(y), d.values())
1000000 loops, best of 3: 1.06 µs per loop
%timeit set([j for i in d.values() for j in i])
1000000 loops, best of 3: 1.54 µs per loop
答案 3 :(得分:0)
from itertools import chain
set(chain(*d.values()))