【问题标题】:List of tuples to dictionary [duplicate]字典的元组列表[重复]
【发布时间】:2011-09-25 05:34:42
【问题描述】:

这是我目前在 Python 中将元组列表转换为字典的方式:

l = [('a',1),('b',2)]
h = {}
[h.update({k:v}) for k,v in l]
> [None, None]
h
> {'a': 1, 'b': 2}

有没有更好的方法?似乎应该有一个单行来做到这一点。

【问题讨论】:

    标签: python list dictionary tuples


    【解决方案1】:

    @pegah 答案的功能决策:

    from itertools import groupby
    
    mylist = [('a', 1), ('b', 3), ('a', 2), ('b', 4)]
    #mylist = iter([('a', 1), ('b', 3), ('a', 2), ('b', 4)])
    
    result = { k : [*map(lambda v: v[1], values)]
        for k, values in groupby(sorted(mylist, key=lambda x: x[0]), lambda x: x[0])
        }
    
    print(result)
    # {'a': [1, 2], 'b': [3, 4]}
    

    【讨论】:

      【解决方案2】:

      似乎这里的每个人都假设元组列表在键和值之间具有一对一的映射(例如,它没有字典的重复键)。由于这是搜索该主题的第一个问题,因此我发布了一个更一般的情况的答案,即我们必须处理重复项:

      mylist = [(a,1),(a,2),(b,3)]    
      result = {}
      for i in mylist:  
         result.setdefault(i[0],[]).append(i[1])
      print(result)
      >>> result = {a:[1,2], b:[3]}
      

      【讨论】:

      • 或者直接使用defaultdict(list)
      • @AbhijitSarkar 之前不要忘记从集合中导入 defaultdict!
      【解决方案3】:

      直接在元组列表上调用dict()

      >>> my_list = [('a', 1), ('b', 2)]
      >>> dict(my_list)
      {'a': 1, 'b': 2}
      

      【讨论】:

      • Derp,我知道会有一个简单的方法来做到这一点......来自Ruby这里,试图学习Python的做事方式。谢谢!
      • @chandresh 这确实在 Python 3 中工作,因此不需要更新。
      • @SvenMarnach,这是我上面在 py 3.5 终端上编写的相同命令的输出。回溯(最近一次调用):文件“”,第 1 行,在 dict(my_list) TypeError: 'Dictionary' object is not callable
      • @chandresh 这与 Python 3 无关——因为你有一个名为 dict 的变量,它隐藏了同名的 Python 内置函数。你永远不应该那样做。
      • @SvenMarnach 哦。谢谢。有效。实际上,我从网上获得了一些代码并尝试运行它。看起来作者使用了dict 作为变量名,我从那里得到了错误。再次感谢。
      【解决方案4】:

      dict理解:

      h = {k:v for k,v in l}
      

      【讨论】:

      • 很好,因为它允许您在将键/值添加到字典之前对其进行格式化
      • 很好,也因为这适用于 Python 2。以上答案不适用。
      【解决方案5】:

      dict 构造函数完全按照您的方式接受输入(键/值元组)。

      >>> l = [('a',1),('b',2)]
      >>> d = dict(l)
      >>> d
      {'a': 1, 'b': 2}
      

      来自documentation

      例如,这些都返回一个 字典等于 {"one": 1, "two": 2}:

      dict(one=1, two=2)
      dict({'one': 1, 'two': 2})
      dict(zip(('one', 'two'), (1, 2)))
      dict([['two', 2], ['one', 1]])
      

      【讨论】:

        猜你喜欢
        • 2018-02-08
        • 2016-06-12
        • 2015-04-03
        • 1970-01-01
        • 1970-01-01
        • 2020-04-03
        • 2020-03-03
        • 1970-01-01
        • 2016-11-04
        相关资源
        最近更新 更多