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

.valuespython3.7では、 との組み合わせを使用できます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()))

は、2 つの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 に答える