2009-05-27 11 views
1

私はレシピ/例のために、デコレート、並べ替え、デコレートの手法を変更せずにタプルのリストを索引付けしてきました。例えばコンテナの要素によってコンテナ(タプル、リスト、辞書)のリストをインデックスする方法はありますか?

:私が使用されている手法は、第二要素のdefaultdictを使用して辞書を構築することである

l=[(a,b,c),(x,c,b),(z,c,b),(z,c,d),(a,d,d),(x,d,c) . . .] 

from collections import defaultdict 

tdict=defaultdict(int) 

for myTuple in l: 
    tdict[myTuple[1]]+=1 

そして私は第二からなるリストを作成する必要がリスト内の各項目のタプル内のitemそこに簡単な方法を取得する方法の数がありますされているものの:その後、

tempList=[myTuple[1] for myTuple in l] 

とtdict

indexDict=defaultdict(dict) 
for key in tdict: 
    indexDict[key]['index']=tempList.index(key) 

に各項目のインデックスを生成明らかにこれは非常にPython的思えません。私は、インデックスを直接取得するために何か魔法を使うことができるはずであると考えて、事例や洞察を見つけることを試みてきました。そのような運はこれまでのところありません。

私は自分のアプローチをもう少し直接取って、tdictを生成できないことを理解しています。

出力は、私は答えはノーだと思いナディアさんから多くのことを学んだ後、インデックス

indexDict={'b':{'index':0},'c':{'index':1},'d':{'index':4},. . .} 

と辞書である可能性があります。

彼女の反応はうまくいくものの、必要以上に複雑だと思います。私は簡単に

def build_index(someList): 
    indexDict={} 
    for item in enumerate(someList): 
     if item[1][1] not in indexDict: 
      indexDict[item[1][1]]=item[0] 
    return indexDict 
+1

私はあなたがしようとしていることに混乱しています。あなたの希望する出力は何ですか?あなたのコードはうまくいきません - "tdict [myTuple [1]] + count ="という行に含まれる数は何ですか? –

+0

予想される出力または構造の例を挙げることができますか? –

+0

申し訳ありません - 私は常に+ = 1に修正する前に+ = countと書くアイテムのカウントを得るために辞書を作成します。私は1つの脳細胞を持っています。 – PyNEwbie

答えて

5

これは、あなたが

dict((myTuple[1], index) for index, myTuple in enumerate(l)) 

>>> l = [(1, 2, 3), (4, 5, 6), (1, 4, 6)] 
>>> dict((myTuple[1], index) for index, myTuple in enumerate(l)) 
{2: 0, 4: 2, 5: 1} 

たい結果を生成します。そして、あなたは、インデックスを表現するために辞書を使う、という場合:

dict((myTuple[1], {'index': index}) for index, myTuple in enumerate(l)) 

結果は次のようになります。

{2: {'index': 0}, 4: {'index': 2}, 5: {'index': 1}} 

EDIT あなたがキー衝突を処理したい場合、あなたはこのようなソリューション拡張する必要があります:

def build_index(l): 
    indexes = [(myTuple[1], index) for index, myTuple in enumerate(l)] 
    d = {} 
    for e, index in indexes: 
     d[e] = min(index, d.get(e, index)) 
    return d 

>>> l = [(1, 2, 3), (4, 5, 6), (1, 4, 6), (2, 4, 6)] 
>>> build_index(l) 
{2: 0, 4: 2, 5: 1} 

EDIT 2

そして、もっと一般化とコンパクトに溶液(sortedと同様の定義)

def index(l, key): 
    d = {} 
    for index, myTuple in enumerate(l): 
     d[key(myTuple)] = min(index, d.get(key(myTuple), index)) 
    return d 

>>> index(l, lambda a: a[1]) 
{2: 0, 4: 2, 5: 1} 

あなたの質問に対する答えは「はい」です:前処理なしでコンテナの要素によってコンテナ(タプル、リスト、辞書)のリストを索引付けするPythonの方法があります。しかし、結果を辞書に保存するというあなたの要求は、1つのライナーになることは不可能です。しかし、前処理はありません。リストは1回だけ反復されます。

+0

これは滑らかです。私は問題について正しい考え方の問題であると考えています。私はこれがコンテナのリスト内のサブコンテナに一般化されるべきであることを知っています。クールでありがとう – PyNEwbie

+0

実際にナディアはこれに近いですが、それほどありません。共通の中間値を持つもう1つのタプルを追加しようとすると、add(2,4,6)と言って、値を上書きする辞書に書き込むときにインデックスが最後の値の列挙になることがわかります。しかし、それは私がそこに着くのに十分なものだったと思う。私はあなたのコードを理解しているので、キーの辞書を作成することを本当に考えているからです。価値の終わり:価値私はそこにいるのです。 – PyNEwbie

+0

私はあなたの問題を解決するためにソリューションを拡張しました –

0

私はこれがあなたが求めていると思うなら...

l = ['asd', 'asdxzc'] 
d = {} 

for i, x in enumerate(l): 
    d[x] = {'index': i} 
+3

なぜ列挙を使用しないのですか? –

+0

その存在を知らなかった。それはかなり簡単になります。 –

+0

あなたのコードシンプルは、リスト内の各ユニークな項目のインデックス値を取得します。インデックス値を少し細かくしたいのですが。ナディアのコードにはきれいな答えがあります。私はもっ​​と良い解決策があるとは思わない。 – PyNEwbie

関連する問題