【问题标题】:Python: how to build a dict from plain list of keys and valuesPython:如何从简单的键和值列表构建字典
【发布时间】:2012-02-28 16:05:25
【问题描述】:

我有一个值列表,例如:

["a", 1, "b", 2, "c", 3]

我想从中构建这样一个字典:

{"a": 1, "b": 2, "c": 3}

在 Python 中执行此操作的自然方式是什么?

【问题讨论】:

  • 您最初是如何获得这份清单的? 应该修复创建该列表的循环以直接创建字典。
  • @S.Lott:列表是 re.findall 调用的结果
  • 请用该重要信息更新问题。应该是原始的 RE 也可能会有所帮助,因为可能有一些方法可以简化您的处理。

标签: python list dictionary


【解决方案1】:
>>> x = ["a", 1, "b", 2, "c", 3]
>>> i = iter(x)
>>> dict(zip(i, i))
{'a': 1, 'c': 3, 'b': 2}

【讨论】:

  • @cha0site 保证iterables从左到右的求值顺序。
  • 谢谢,就是这样!我什至将我的项目列表定义为 x = (...) 而不是 [...] 并摆脱了显式的 iter() 调用。
  • @Josh:根据zip docs,看来你是对的。 +1 然后 =)
  • @izhak 需要显式调用iter 才能将列表一分为二。见docs.python.org/library/itertools.html#itertools.izip的成语
  • @IvoFlipse:你了解每个组件(iter、zip 和 dict)吗? Iter 很简单:当您调用.next() 时,它只会返回列表的下一个值。我编写了一个简单的 zip 实现(仅适用于两个参数):codepad.org/ywXjojYM 尝试用i 替换左右两侧并在脑海中运行代码,或者在每个步骤之间添加“打印”。
【解决方案2】:

这看起来相当简洁,但我不会说它很自然:

>>> l = ["a", 1, "b", 2, "c", 3]
>>> dict(zip(l[::2], l[1::2]))
{'a': 1, 'c': 3, 'b': 2}

【讨论】:

    【解决方案3】:

    你可以zip这样的替代元素列表

    >>> lst = ["a", 1, "b", 2, "c", 3]
    >>> dict(zip(lst[::2], lst[1::2])
    {'a': 1, 'c': 3, 'b': 2}
    

    【讨论】:

      【解决方案4】:

      另一种方式:

      >>> l = ["a", 1, "b", 2, "c", 3]
      >>> dict([l[i:i+2] for i in range(0,len(l),2)])
      {'a': 1, 'c': 3, 'b': 2}
      

      【讨论】:

        【解决方案5】:

        我真的没有看到很多情况会遇到这个确切的问题,所以没有“自然”的解决方案。然而,一个可以为您解决问题的快速班轮是:

           {input_list[2*i]:input_list[2*i+1] for i in range(len(input_list)//2)}
        

        【讨论】:

        • 我怀疑这会奏效。也不要对变量使用内置名称 (input)。在 Python 2.7 中,它只是在 for 上失败,而在 Python 3 中,它为 range 是 float 的论点感到悲哀。
        • 在发布之前在 python 2.7.1 中尝试过。不知道它是如何翻译成其他版本的。
        • @Nobody:这在 2.7 中运行良好;你的ideone链接是2.6,它没有dict理解。将 / 更改为 // 也可以使其在 3 中工作。
        • @DSM 是的,你是对的,我错误地记住了我系统的 python 版本为 2.7.1(它是 2.6.5),我得到了错误。正如您在我给出的第三个链接中看到的那样,我已经设计了// 更正。这个讨论是另一个例子,为什么我们在提供 python 代码时总是应该给出版本号。
        猜你喜欢
        • 1970-01-01
        • 2015-06-30
        • 1970-01-01
        • 1970-01-01
        • 2018-01-14
        • 2016-10-08
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        相关资源
        最近更新 更多