【问题标题】:List of tuples, first tuple as key, grouping by key into into a dictionary [duplicate]元组列表,第一个元组作为键,按键分组到字典中[重复]
【发布时间】:2012-10-22 16:13:46
【问题描述】:

我有一个元组列表。第一部分是一个标识符,可以重复也可以不重复。我想将此列表处理成字典,由标识符键入。问题是,我一直无法考虑按键覆盖:

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。

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

【问题讨论】:

  • 还有一个关于defaultdict的问题?
  • l = [xx[1:] for xx in x] 会更好。也没有理由这样做x = list(g)
  • 这是您的预期输出吗?或者你想要类似的东西:{123:('efg', 'hij','abc','def'), 456:('klm', 'nop')}
  • 其实我想要 {123:[('efg', 'hij'),('abc','def')]} for k,v
  • 由于当前代码给出了预期的答案,这可能更适合codereview.stackexchange.com

标签: python list dictionary tuples grouping


【解决方案1】:

一个简单的方法是

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')]}
    

    【讨论】:

    • 如果你想在一个地方初始化 dict 但想在初始化后继续为无效键获取 KeyErrors,这真的很好。
    【解决方案3】:

    如果出于某种原因使用itertools.groupby,那么您可以避免使用defaultdictsetdefault 方法 - [事实上,如果您想走这些路线,那么您并不真的需要groupby!] - by:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 2016-09-21
      • 2014-01-28
      • 2019-04-24
      • 2020-09-25
      • 1970-01-01
      • 2020-05-12
      相关资源
      最近更新 更多