【问题标题】:Use of if/else in an dictionary comprehension in Python 3.x [duplicate]在 Python 3.x 的字典理解中使用 if/else [重复]
【发布时间】:2019-06-02 07:19:14
【问题描述】:

假设我有:

l = [
    ['Brasil', 'Italia', [10, 9]],
    ['Brasil', 'Espanha', [5, 7]], 
    ['Italia', 'Espanha', [7,8]],
    ]

还有一个空字典:

d = {}

我正在尝试在字典理解中执行此操作:

for x in l:
    if (x[0] not in d):
        d[x[0]] = 0
    else:
        d[x[0]] += 1

# Out: {'Brasil': 1, 'Italia': 0}

但是当我尝试时:

d = {k: (0 if (k not in d) else (d[k]+1)) for k in [x[0] for x in l]}

# Out: {'Brasil': 0, 'Italia': 0}

我做错了什么?

【问题讨论】:

  • 在您的列表中,巴西与 10 相关联,意大利与 9 相关联?
  • 这可能是Counter 的工作。
  • 对于给定的 ld 看起来如何?
  • @Feelsbadman 仅以合乎逻辑的方式
  • 理解构建一个新字典,然后赋值将名称“d”重新绑定到该字典。你原来的字典是空的。

标签: python python-3.x


【解决方案1】:

更好的方法是使用来自collections 模块的Counter

from collections import Counter

l = [
    ['Brasil', 'Italia', [10, 9]],
    ['Brasil', 'Espanha', [5, 7]], 
    ['Italia', 'Espanha', [7,8]],
    ]

c = Counter([x[0] for x in l])
c.subtract({x[0]: 1 for x in l})

print(c)
# Counter({'Brasil': 1, 'Italia': 0})

【讨论】:

  • 输出错误,计数高 1
  • 但我想了解它为什么不起作用,我的理解看起来很适合我,我需要澄清一下。而出局是错误的
  • @Chris_Rands,哎呀。更新了我的;不知道是不是太花哨了。谢谢。
  • 我认为这不是正确的做法,减法在这段代码中非常难看
  • @Chris_Rands: 更简单:c.subtract(c.keys())(在dict 上需要调用keys 的少数情况之一,因为它绕过了减去Counter.subtract 否则会使用的映射的路径,这会将所有计数减少到 0)。由于它是一个视图,因此不需要昂贵/大型临时工。至于为什么OP的代码不起作用,那是因为在dict理解完成之前,对d的赋值不会发生(它完全构造了新的dict,然后赋值),所以没有d(或只有旧的d)要查看。您不能引用正在进行的dict
猜你喜欢
  • 2017-09-09
  • 2019-07-12
  • 1970-01-01
  • 2012-03-15
  • 2020-10-13
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多