8

辞書の関数によって返されmap()たオブジェクトで使用しようとしています。ただし、次のことはできないようです。dict_valuesvalues()map()dict_values

map(print, h.values())
Out[31]: <builtins.map at 0x1ce1290>

これを行う簡単な方法があると確信しています。私が実際にやろうとしているのは、 の辞書内set()のすべてのCounterキーの を作成し、次のCountersようにすることです。

# counters is a dict with Counters as values
whole_set = set()
map(lambda x: whole_set.update(set(x)), counters.values())

Pythonでこれを行うより良い方法はありますか?

4

2 に答える 2

18

Python 3 ではmap、リストではなく反復子を返します。明示的に呼び出すか、ループlistに入れることによって、それを反復処理する必要があります。forしかし、mapとにかくこの方法を使用するべきではありません。map実際には、戻り値を反復可能またはシーケンスに収集するためのものです。どちらprintset.update値を返さないためmap、この場合の使用は慣用的ではありません。

あなたの目標は、すべてのカウンターのすべてのキーをcounters1 つのセットに入れることです。これを行う 1 つの方法は、ネストされたジェネレータ式を使用することです。

s = set(key for counter in counters.values() for key in counter)

Python 2.7以降で利用可能で(Lattywareに感謝!)、辞書だけでなくセットも生成できる素敵なdict内包構文もあります:

s = {key for counter in counters.values() for key in counter}

これらはどちらも次のものとほぼ同等です。

s = set()
for counter in counters.values():
    for key in counter:
        s.add(key)
于 2012-05-21T21:03:43.367 に答える
0

のすべての値の集合結合が必要countersですか? すなわち、

counters[1].union(counters[2]).union(...).union(counters[n])

? それは単なるfunctools.reduceです:

import functools

s = functools.reduce(set.union, counters.values())


counters.values()まだセットになっていない場合(たとえば、リストの場合)、最初にそれらをセットに変換する必要があります。を使用して辞書内包表記を使用してそれを行うことができますがiteritems、これは少し不格好です:

>>> counters = {1:[1,2,3], 2:[4], 3:[5,6]}
>>> counters = {k:set(v) for (k,v) in counters.iteritems()}
>>> print counters
{1: set([1, 2, 3]), 2: set([4]), 3: set([5, 6])}

またはもちろん、気にしないので、インラインで実行できますcounters.keys()

>>> counters = {1:[1,2,3], 2:[4], 3:[5,6]}
>>> functools.reduce(set.union, [set(v) for v in counters.values()])
set([1, 2, 3, 4, 5, 6])
于 2014-03-24T20:32:16.037 に答える