2009-05-27 36 views
1

我一直在寻找一个食谱/示例来索引元组列表,而不用修改装饰,排序,未整理的方法。在Python中是否有方法通过容器的元素来索引容器列表(元组,列表,字典)?

例如:

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) 

每个项目的索引显然,这似乎不是很Python的。我一直在试图找到例子或见解,认为我应该能够使用神奇的东西来直接获取索引。目前没有这样的运气。

请注意,我知道我可以更直接地采取我的方法,而不是生成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 
+1

我很困惑你想要做什么。你想要的输出是什么?你的代码不工作 - 计数应该在行“tdict [myTuple [1]] + = count”是什么? – 2009-05-27 21:27:55

+0

你能提供一个预期的输出或结构的例子吗? – 2009-05-27 21:28:00

+0

对不起 - 每次我创建一个字典来获取一个项目的数量,我总是写入+ =计数,然后将其修正为+ = 1。我有一个脑细胞。 – PyNEwbie 2009-05-27 21:38:56

回答

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} 

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

0

如果我认为这是你问的问题...

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

for i, x in enumerate(l): 
    d[x] = {'index': i} 
相关问题