【问题标题】:List of three-tuples to a dictionary of list of lists三元组列表到列表列表字典
【发布时间】:2016-04-14 22:02:13
【问题描述】:

我需要每个元组中的第一项作为返回对应项列表的键。比如……

这是我的输入数据:

my_problem = [(1,20,400), (1,30,450), (2,40,525), (2,50,600), (2,70,680),(3,80,700), (3,90,980)]

这就是我想要实现的目标:

my_solution = {'1': [[20,400],[30,450]], '2': [[40,525],[50,600],[70,680]], '3': [[80,700], [90,980]]}

我的实际列表有数千个不同长度的元组。

【问题讨论】:

    标签: python list dictionary tuples


    【解决方案1】:

    使用defaultdict。这些漂亮的结构本质上是字典,可以在插入键时使用 default 值进行初始化:

    from collections import defaultdict
    
    solution = defaultdict(list) # create defaultdict with default value []
    for item in my_problem:
        solution[item[0]].append(list(item[1:]))
    

    并转换回字典(虽然这是不必要的,因为 defaultdict 已经具有常规字典的行为)你可以这样做

    my_solution = dict(solution)
    

    Python 3 中稍微简洁的公式

    (感谢 tobias_k 指出这一点)

    在 Python 3 中,您可以替换丑陋的 item[0] 等调用以使用以下内容:

    solution = defaultdict(list)
    for first, *rest in my_problem:
        solution[first].append(rest)
    

    【讨论】:

    • 有了 Python 3,你也可以做到for first, *rest in my_problem:
    • @tobias_k 不错!内联拆包很整洁!
    【解决方案2】:
    data = {}
    for item in my_problem:
        data[item[0]] = data.get(item[0], []) + [item[1:]]
    

    制作一个新字典来保存结果;遍历输入列表,并将其添加到字典中 - 如果给定键已经存在列表,则添加到其中,否则启动一个空列表并添加到该列表中。

    【讨论】:

      【解决方案3】:
      #! python3
      my_problem = [(1,20,400), (1,30,450), (2,40,525), (2,50,600), (2,70,680),(3,80,700), (3,90,980)]
      
      import collections
      my_solution = collections.defaultdict(list)
      for k,*v in my_problem:
          my_solution[k].append(v)
      
      print(my_solution)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-12
        • 2015-12-17
        • 1970-01-01
        • 2020-05-10
        • 1970-01-01
        • 1970-01-01
        • 2017-04-06
        • 1970-01-01
        相关资源
        最近更新 更多