Python - 将列表的字典展平为唯一值?

Jon*_*sco 27 python

我在python中有一个列表的词典:

content = {88962: [80, 130], 87484: [64], 53662: [58,80]}
Run Code Online (Sandbox Code Playgroud)

我想把它变成一个唯一值的列表

[58,64,80,130]
Run Code Online (Sandbox Code Playgroud)

我写了一个手动解决方案,但这是一个手动解决方案.我知道有更简洁,更优雅的方式来做这个与列表理解,map/reduce,itertools等等任何人都有线索?

content = {88962: [80, 130], 87484: [64], 53662: [58,80]}
result = set({})
for k in content.keys() :
    for i in content[k]:
        result.add(i)
# and list/sort/print just to compare the output
r2 = list( result )
r2.sort()
print r2
Run Code Online (Sandbox Code Playgroud)

nne*_*neo 36

双重理解:

sorted({x for v in content.itervalues() for x in v})
Run Code Online (Sandbox Code Playgroud)

  • @TomMyddeltyn在python 3中将`itervalues`替换为`values`(就像你用字典替换`iteritems`为'items`)因为Python 3支持lazy迭代 (2认同)

Jon*_*nts 11

from itertools import chain
sorted(set(chain(*content.values())))
# [58, 64, 80, 130]

# another option is `itertools.groupby`
from itertools import groupby
[k for k, g in groupby(sorted(chain(*content.values())))]
Run Code Online (Sandbox Code Playgroud)

或另一种选择是.values:

from itertools import chain
sorted(set(chain.from_iterable(content.itervalues())))
# [58, 64, 80, 130]

# another option is `itertools.groupby`
[k for k, g in groupby(sorted(chain.from_iterable(content.itervalues())))]
Run Code Online (Sandbox Code Playgroud)


Ash*_*ary 6

使用set()itertools.chain()

In [83]: content = {88962: [80, 130], 87484: [64], 53662: [58,80]}

In [84]: from itertools import chain

In [94]: x=set(chain(*content.values()))

In [95]: x
Out[95]: set([58, 64, 80, 130]) # a set, the items may or may not be sorted

In [96]: sorted(x)         #convert set to a sorted list
Out[96]: [58, 64, 80, 130]
Run Code Online (Sandbox Code Playgroud)