一套字典值

时间:2015-09-13 05:38:38

标签: python

我有以下词典:

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])

有没有办法在一行中做到这一点?

4 个答案:

答案 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()))