【问题标题】:if-else comprehension with dictionary not working in python3字典的if-else理解在python3中不起作用
【发布时间】:2013-07-07 01:37:58
【问题描述】:
dlist=['All my loving','All my bros','And all sis']

我想创建一个字典,以便为所有单词(作为键)分配一个值,该值是单词出现的 dlist 的索引。 例如, 'All':{0,1}、'my':{0,1}、'sis'={2} 等

不知何故这不起作用:

dict={}
{w:{num} if w not in dict.keys() else dict[w].add(num) for (num,strn) in enumerate(dlist) for w in strn.split()}

返回

{'All':{2}, 'my':{2}}

看起来 else 语句被忽略了。任何指针? 谢谢

【问题讨论】:

  • 一旦你有两个 for 循环和一个 if 语句在一个 dict 理解中,考虑将它分成几行。
  • 您通过不为其分配名称来丢弃您的 dict 理解的结果,并且您正在改变您现有的 dict 作为理解的一部分。最重要的是,您已命名变量dict,这本身就令人困惑。几乎就好像你已经尝试以最迟钝的方式来写它。使用更好的变量名,不要试图将其全部写在一行中。

标签: python dictionary python-3.x list-comprehension if-statement


【解决方案1】:

这不起作用,因为您在 dict 理解中创建 dict 时尝试访问 dict.keys。如果这是在 for 循环中,则 dict.keys 将更新每个元素,但 dict 理解确保 dict 在创建过程中不会更新以提高速度。

这样的事情应该可以工作:

myDict = {}
for (num, strn) in enumerate(dlist):
    for w in strn.split():
        if w not in myDict:
            myDict[w] = {num}
        else:
            myDict[w].add(num)

【讨论】:

  • 感谢 RiaD 和 Jmac。我有一个类似 Jmac 给出的代码,但试图查看是否可以以某种方式使用 dict 理解。我不明白为什么用一行理解重写上面的代码不起作用。多亏了 Jmac,我现在很清楚 - 试图在鸡孵化之前把它弄出来!
  • 重命名dict。它隐藏了内置的dict
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 2012-03-15
  • 1970-01-01
  • 2019-11-26
  • 2020-10-13
  • 1970-01-01
  • 2018-02-25
相关资源
最近更新 更多