32

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

7 回答 7

48

双组理解:

蟒蛇 3:

sorted({x for v in content.values() for x in v})

蟒蛇2:

sorted({x for v in content.itervalues() for x in v})
于 2012-10-22T17:03:45.397 回答
15

在 python3.7 中,您可以使用.values和的组合chain

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

在python2.7

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())))]
于 2012-10-22T17:02:28.043 回答
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]
于 2012-10-22T17:00:00.090 回答
4
sorted(set(val
            for row in content.itervalues()
                for val in row))

set为我们获取所有不同的值(如字典,但没有存储值的开销)。 sorted然后只接受创建的set并返回一个list按升序排序的。

于 2012-10-22T17:00:38.007 回答
4
list(reduce(lambda a, b: a.union(set(b)), content.itervalues(), set()))

lambda两个输入参数转换为集合并将它们联合起来。

reduce将对传递给它的列表进行左折叠——在这种情况下,列表是您的字典的值。

reduce将把这个结果变成set一个列表。

这也可以拼写:

list(reduce(lambda a, b: a | set(b), content.itervalues(), set()))
于 2012-10-22T17:01:14.387 回答
2
sorted(set(sum(content.values(), [])))
于 2012-10-22T17:09:26.993 回答
2

使用列表推导生成一个非唯一列表,将其转换为集合以获取唯一值,然后返回排序列表。也许不是最有效的,但又是另一种单行解决方案(这次没有导入)。

蟒蛇 3:

sorted(list(set([val for vals in content.values() for val in vals])))

蟒蛇 2.7:

sorted(list(set([val for vals in content.itervalues() for val in vals])))
于 2018-08-02T16:09:24.990 回答