2012-01-11 12 views
1

私はオブジェクト(クラスタ)のリストを持っており、各オブジェクトは数値のリストである属性verticesを持っています。私は、キーが頂点番号であり、値が実際のリスト内の対応するクラスターのインデックスであるように、(1つのライナーを使用して)辞書を構築したいと思います。複数のリストをマージする辞書を構築する

例:

clusters[0].vertices = [1,2] 
clusters[1].vertices = [3,4] 

予想される出力:それは作品

dict(reduce(lambda x,y:x.extend(y) or x, [ 
    dict(zip(vertices, [index]*len(vertices))).items() 
    for index,vertices in enumerate([i.vertices for i in clusters])])) 

...しかし、やってのより良い方法がある:

{1:0,2:0,3:1,4:1} 

私は、次のを思い付きましたこの?

上記コードの効率についてもコメントしてください。

PS:頂点リストは互いに素です。

+6

期待される出力:{1:0,2:0,3:1、** 4:1 **}でしたか? – kasyc

+0

申し訳ありませんが更新されました:) – Graddy

+0

私はあなたがそれを行う関数を書くことをお勧めしますし、あなたの1ライナーは関数呼び出しです。 [可読性](http://www.python.org/dev/peps/pep-0020/) – MattH

答えて

5

これは、ネストされたforを使用して、かなりシンプルなソリューションです:

dict((vert, i) for (i, cl) in enumerate(clusters) for vert in cl.vertices) 

のためのデータを収集しながら、それは中間リストの多くを構築していないので、これは、また、問題のバージョンよりも効率的ですdict。

関連する問題