gpt4 book ai didi

python - Python 中有没有一种方法可以通过容器的元素索引容器列表(元组、列表、字典)?

转载 作者:太空宇宙 更新时间:2023-11-04 09:22:15 26 4
gpt4 key购买 nike

我一直在寻找一个方法/示例来索引元组列表,而无需修改修饰、排序、取消修饰方法。

例如:

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。我一直在尝试寻找示例或见解,认为我应该能够使用一些神奇的东西来直接获取索引。到目前为止还没有这样的运气。

请注意,我知道我可以更直接地采用我的方法而不生成 tdict。

输出可以是带有索引的字典

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

在从 Nadia 的回答中了解到很多之后,我认为答案是否定的。

虽然她的回应有效,但我认为它比需要的更复杂。我只想

 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

最佳答案

这会产生你想要的结果

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 中有一种方法可以通过容器的元素对容器列表(元组、列表、字典)进行索引,而无需进行预处理。但是您要求将结果存储在字典中,这使得不可能成为一个类轮。但是这里没有预处理。该列表仅迭代一次。

关于python - Python 中有没有一种方法可以通过容器的元素索引容器列表(元组、列表、字典)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/918076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com