2012-10-22 106 views
1

我有一个元组列表。第一部分是可能重复也可能不重复的标识符。我想把这个列表处理成一个字典,用标识符作为键。这个问题,我一直无法考虑用钥匙覆盖:元组列表,第一个元组作为键,按键分组到字典中

def response_items(self): 
     ri = self.response_items_listing#(gets the list)   
     response_items = {} 
     for k, g in groupby(ri, itemgetter(0)): 
      x = list(g) 
      l = [(xx[1],xx[2]) for xx in x] 
      response_items[k] = l 
     return response_items 

例如,列表,如:

[('123', 'abc', 'def'),('123', 'efg', 'hij'),('456', 'klm','nop')]

会回来的

{123:('efg', 'hij'), 456:('klm', 'nop')}

,但我需要:

{123:[('abc', 'def'),('efg', 'hij')], 456:('klm', 'nop')}

我需要把在步骤合并/汇总按键,但我没有看到它完全atm。

什么是更好或更有效的解决方案?

+3

关于'defaultdict'的另一个问题是? –

+0

'l = [xx [1:] for xx in x]'会更好。也没有理由做'x = list(g)'。 –

+0

这是您的预期产出?或者你想要的东西像:{123 :('efg','hij','abc','def'),456 :('klm','nop')}' –

回答

2

一个简单的方法是

from collections import defaultdict 

ri = [('123', 'abc', 'def'),('123', 'efg', 'hij'),('456', 'klm','nop')] 
response_items = defaultdict(list) 
for r in ri: 
    response_items[r[0]].append(r[1:]) 
print response_items 

这给

defaultdict(<type 'list'>, {'123': [('abc', 'def'), ('efg', 'hij')], 
          '456': [('klm', 'nop')]}) 

如果你想

defaultdict(<type 'list'>, {'123': ['abc', 'def', 'efg', 'hij'], 
          '456': ['klm', 'nop']}) 

作为输出,可以使用response_items[r[0]].extend(r[1:])

2

您可以使用setdefault()

In [79]: dic={} 
In [80]: for x in lis: 
    dic.setdefault(x[0],[]).append(x[1:]) 
    ....:  
    ....:  

In [82]: dic 
Out[82]: {'123': [('abc', 'def'), ('efg', 'hij')], '456': [('klm', 'nop')]} 
+0

如果你想在一个地方初始化字典,但想要在初始化后继续获取无效密钥的KeyErrors,这真的很不错。 – grinch

1

如果有某种原因,使用itertools.groupby来,那么你就可以避免使用defaultdictsetdefault方法 - [其实,如果你想往下走的路线,那么你并不真正需要的GROUPBY!] - 通过:

mydict = {} 
for k, g in groupby(some_list, itemgetter(0)): 
    mydict[k] = [el[1:] for el in g] 
相关问题