Я искал рецепт / пример для индексации списка кортежей, не применяя модификацию подхода decorate, sort, undecorate.
Например:
l=[(a,b,c),(x,c,b),(z,c,b),(z,c,d),(a,d,d),(x,d,c) . . .]
Подход, который я использовал, состоит в том, чтобы создать словарь, используя defaultdict из второго элемента
from collections import defaultdict
tdict=defaultdict(int)
for myTuple in l:
tdict[myTuple[1]]+=1
Затем я должен построить список, состоящий только из второго элемента в кортеже для каждого элемента в списке. В то время как есть несколько способов добраться, простой подход заключается в следующем:
tempList=[myTuple[1] for myTuple in l]
, а затем сгенерировать индекс каждого элемента в tdict
indexDict=defaultdict(dict)
for key in tdict:
indexDict[key]['index']=tempList.index(key)
Ясно, что это не похоже на Pythonic. Я пытался найти примеры или идеи, думая, что я смогу использовать что-то волшебное, чтобы получить индекс напрямую. Пока такой удачи нет.
Заметьте, я понимаю, что могу использовать свой подход немного более прямо и не генерировать тдикт.
выводом может быть словарь с индексом
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