1

私は、装飾、ソート、装飾解除のアプローチを変更せずに、タプルのリストにインデックスを付けるためのレシピ/例を探していました。

例えば:

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

私が使用してきたアプローチは、2 番目の要素の defaultdict を使用して辞書を作成することです。

from collections import defaultdict

tdict=defaultdict(int)

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

次に、リスト内の各項目について、タプルの 2 番目の項目のみで構成されるリストを作成する必要があります。そこにたどり着くにはいくつかの方法がありますが、簡単な方法は次のとおりです。

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

次に、tdict の各項目のインデックスを生成します

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

明らかに、これはあまり Pythonic ではないようです。インデックスを直接取得するために何か魔法のようなものを使用できるはずだと考えて、例や洞察を見つけようとしています。これまでのところ、そのような幸運はありません。

注意してください、私は自分のアプローチをもう少し直接的に取ることができ、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
4

2 に答える 2

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}}

編集 キーの衝突を処理したい場合は、次のようにソリューションを拡張する必要があります。

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}

編集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 回だけ繰り返されます。

于 2009-05-27T21:44:16.533 に答える
0

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

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

for i, x in enumerate(l):
    d[x] = {'index': i}
于 2009-05-27T21:32:25.437 に答える