17

セットのセットの和集合を見つけようとしています。networkx具体的には、と呼ばれるグラフのディクショナリ内の各キーのノードのリストの結合が必要ですperiodic_gs。のキーである すべてreduceの結合を取るのが合理的と思われるため、関数を使用したいと思います。periodic_gs[x].nodes()xperiodic_gs

これが私の試みです:

reduce(lambda x,y: set(periodic_gs[x].nodes()).union(set(periodic_gs[y].nodes())), periodic_gs.keys(), {})

私にとって、これは、辞書内の各グラフでノードの結合を取ることを意味します。何らかの理由で、python は次のように教えてくれます:はキーのリストであるため(これらは文字列ですが、これがどのように重要なのかわかりません)、ラムダ関数の引数を代入すると動作するため、 this は表示されませんTypeError: unhashable type: 'dict'TypeErrorperiodic_gs.keys()

型エラーの原因とその修正方法を教えてください。

4

5 に答える 5

4

{}セットではなく、空の辞書です。set()空のセットを作成するために使用します。

reduce()ただし、ここでどのように機能するかを誤解していると思います。xは のの戻り値で、lambdayシーケンスの次の値です。セットを返すため、xここでは常にセットであり、それを のキーとして使用することはできませんperiodic_gs

グラフ内のすべてのノードの結合が必要な場合は、 and を使用itertools.chain.from_iterable()set()ます。

from itertools import chain

set(chain.from_iterable(periodic_gs[key].nodes() for key in periodic_gs))

これにより、各呼び出しから1 つのセットが作成されます。nodes()

使用reduce()するには、最初の引数が常にセットであることを考慮する必要があります。

reduce(lambda res, key: res.union(periodic_gs[key].nodes()),  periodic_gs, set())

periodic_gsここでは、通常の辞書と同じように反復可能 (キーを生成)であると想定しています。そうでない場合は、 を使用しますperiodic_gs.keys()

通常の辞書を使用した簡単なデモ:

>>> example = {'foo': [1,2,3], 'bar': [3, 4, 1]}
>>> reduce(lambda res, key: res.union(example[key]), example, set())
set([1, 2, 3, 4])
于 2013-11-13T22:27:29.257 に答える