【问题标题】:Dictionary Comprehension in Python 3Python 3 中的字典理解
【发布时间】:2013-12-27 16:23:34
【问题描述】:

我在Python2.7Python 3+Create a dictionary with list comprehension in Python 中发现了以下关于字典推导的堆栈溢出帖子:Create a dictionary with list comprehension in Python 声明我可以像这样应用字典推导:

d = {key: value for (key, value) in sequence}

我在 Python 3 中尝试过。但是,它引发了异常。

d = {'a':1, 'b':2, 'c':3, 'd':4}
{key : value for (key, value) in d}
{key : value for key, value in d}

两个版本都提出 ValueError 表示 ValueError: need more than 1 value to unpack

在 Python3 中进行字典理解的最简单/最直接的方法是什么?

【问题讨论】:

  • dict 理解需要一系列键值对。你给它一个字典,它不是一个键值对序列。
  • 我知道这是一个老问题,但我只是想补充一点以避免错误,d 应该是(('a', 1), ('b', 2), ('c', 3'), ('d', 4))

标签: python python-3.x


【解决方案1】:

遍历字典只会产生。使用d.items() 循环遍历键和值:

{key: value for key, value in d.items()}

您看到的ValueError 异常不是 dict 理解问题,也不限于Python 3;您会在 Python 2 或常规 for 循环中看到同样的问题:

>>> d = {'a':1, 'b':2, 'c':3, 'd':4}
>>> for key, value in d:
...     print key, value
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack

因为每次迭代只产生一个项。

如果不进行转换,{k: v for k, v in d.items()} 只是冗长而昂贵的d.copy();仅当您对键或值进行更多操作,或者使用条件或更复杂的循环构造时,才使用 dict 推导式。

【讨论】:

    【解决方案2】:

    上面说得好——如果你这样做,你可以在 Python3 中删除项目:

    {key: d[key] for key in d}

    d = {'a':1, 'b':2, 'c':3, 'd':4}
    z = {x: d[x] for x in d}
    z
    >>>{'a': 1, 'b': 2, 'c': 3, 'd': 4}
    

    这也提供了使用条件的能力

    y = {x: d[x] for x in d if d[x] > 1}
    y
    >>>{'b': 2, 'c': 3, 'd': 4}
    

    享受吧!

    【讨论】:

      【解决方案3】:

      字典理解是指通过某种逻辑在字典中生成项目:

      x = {p: p*p for p in range(10)}
      
      print(x)
      
      y = {q: q*3 for q in range(5,15) if q%2!=0}
      
      print(y)
      

      【讨论】:

        猜你喜欢
        • 2021-01-28
        • 2020-10-19
        • 2011-03-14
        • 2013-01-08
        • 1970-01-01
        • 2022-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多