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

时间:2012-10-22 16:58:51

标签: python

我在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

7 个答案:

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