【问题标题】:Python: transform list of tuples in dictionaryPython:转换字典中的元组列表
【发布时间】:2014-06-03 19:16:56
【问题描述】:

想知道是否有更惯用(pythonic)的方式来做到这一点。我有一个游标对象返回的元组列表,我正在尝试重新组合字典中的数据。我得到的数据格式如下:

[("Département d'informatique", 119, 74, 193),
 ("Département d'informatique", 193, 67, 260), 
 ("Département de chimie", 355, 44, 399) ... ]

请注意部门重复。同一部门的每一行代表不同类型的数据。我需要在包含键(部门名称)的字典中重新组合该数据,并且该值将是将该部门作为其第一个成员的所有元组的列表。所以是这样的:

{ "Département d'informatique": [(119, 74, 193), (193,67,260) ...] }

这是我的代码。它目前正在工作,但我不确定它是否是最有效的/pythonic 的做事方式。

def preparer_donnees(data):
    ret = { ligne[0] : [] for ligne in data }

    for ligne in data:
        for entree in ligne[1:]:
            ret[ligne[0]].append(entree)

    return ret

谢谢!

【问题讨论】:

    标签: python django dictionary


    【解决方案1】:

    我会使用collections.defaultdict:

    def preparer_donnees(data):
        from collections import defaultdict
    
        ret = defaultdict(list)
    
        for v in data:
            ret[v[0]].append(v[1:])
    
        return ret
    

    【讨论】:

      【解决方案2】:

      您可以使用嵌套列表推导:

      {line[0] : [tup[1:] for tup in data if tup[0] == line[0]] for line in data}
      

      【讨论】:

        【解决方案3】:

        如果所有元组都有 4 个元素,你可以解包元组:

        my_d = {}
        
        for k, v1, v2, v3 in l:
            if my_d.get(k):
                my_d[k] += [(v1,v2,v3)]
            else:
                my_d[k] = [(v1,v2, v3)]
        

        【讨论】:

          【解决方案4】:

          您可以使用字典“setdefault”方法(在许多情况下可以使用 defaultdict 替换它 - 但并非总是如此 - 我喜欢 setdefault 更通用且功能强大)

          Use cases for the 'setdefault' dict method

          def process( data ):
              result = {}
              for vals in data:
                  result.setdefault( vals[0], [] ).append( vals[1:] )
              return result
          

          另外,mathsaey 的回答

          {line[0] : [tup[1:] for tup in data if tup[0] == line[0]] for line in data}
          

          是错误的,因为他的字典的值是列表列表而不是值列表。我没有足够的声誉来发表评论(新帐户),所以在此处添加此观察。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-26
            • 1970-01-01
            • 2017-01-20
            • 2013-04-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多