我在python中有一个列表词典:
content = {88962: [80, 130], 87484: [64], 53662: [58,80]}
我想将其转换为唯一值列表
[58,64,80,130]
我写了一个手动解决方案,但这是一个手动解决方案。我知道有更简洁,更优雅的方式来实现这一点,列表理解,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
答案 0 :(得分:34)
双重理解:
sorted({x for v in content.itervalues() for x in v})
答案 1 :(得分:10)
from itertools import chain
sorted(set(chain.from_iterable(content.itervalues())))
# [58, 64, 80, 130]
或另一个选项是itertools.groupby
:
[k for k, g in groupby(sorted(chain.from_iterable(content.itervalues())))]
答案 2 :(得分:4)
使用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]
答案 3 :(得分:4)
sorted(set(val
for row in content.itervalues()
for val in row))
set
获取所有不同的值(如字典,但没有存储值的开销)。 sorted
然后只接受创建的set
并返回按升序排序的list
。
答案 4 :(得分:4)
list(reduce(lambda a, b: a.union(set(b)), content.itervalues(), set()))
lambda
将两个输入参数转换为集合并将它们联合起来。
reduce
将对传递给它的列表执行left fold - 在这种情况下,列表是您词典的值。
reduce
会将此结果(set
)转回列表。
这也可以拼写:
list(reduce(lambda a, b: a | set(b), content.itervalues(), set()))
答案 5 :(得分:1)
sorted(set(sum(content.values(), [])))
答案 6 :(得分:1)
使用列表推导生成一个非唯一列表,将其转换为一个集合以获取唯一值,然后返回到排序列表中。也许不是最有效的解决方案,但又是另一种解决方案(这次没有导入)。
Python 3:
sorted(list(set([val for vals in content.values() for val in vals])))
Python 2.7:
sorted(list(set([val for vals in content.itervalues() for val in vals])))