【问题标题】:Dictionary comprehension whilst checking if key already exists?字典理解同时检查键是否已经存在?
【发布时间】:2018-07-28 06:26:19
【问题描述】:

我知道您可以使用以下方法检查密钥是否存在:

if key in mydict:
    ...

但我希望在构建字典时以某种方式在字典理解中使用它。

例如:

mylist = [('a', 0.01), ('b', 0.02), ('c', 0.03), ('a', 0.04)]
mydict = {item[0]: item[1] for item in mylist if item[0] not in mydict else blah blah}

实现这一目标的最佳方法是什么?

我还需要 else 部分。

编辑:澄清。在我的情况下,我实际上需要给定 item[0] 值的所有项目的 item[1] 值的总和。

【问题讨论】:

  • 感谢您的回复,我已经编辑了问题,因为我忘了提到 else 部分对我的任务很重要
  • not in mydict - 在最终创建字典之前,您不能引用它。在 Python 中,赋值从“右”到“左”
  • blah blah 背后的逻辑是什么? Dict 具有支持默认值的 getsetdefault 方法。根据您的具体目标,您可能会使用这些方法。

标签: python dictionary-comprehension


【解决方案1】:

使用字典理解:

mylist = [('a', 0.01), ('b', 0.02), ('c', 0.03), ('a', 0.04)]
mydict = {key:value for key, value in mylist[::-1]}
print(mydict)

输出:

{'a': 0.01, 'c': 0.03, 'b': 0.02}

没有字典理解:

mydict = {}
for key, value in mylist:
    if key not in mydict:
        mydict[key] = value
    else:
        # You asked for the else part. Do whatever here.   
print(d)

输出:

{'a': 0.01, 'c': 0.03, 'b': 0.02}

【讨论】:

  • 是的,mydict[key] = value 在速度方面似乎表现更好。但我看重可读性。
  • 相信我,Python 程序员希望看到mydict[key] = value。这是最易读的选项。 update() 用于合并 字典,其中定义了关于覆盖现有键的规则。当我看到update() 时,我立即想到可能存在键冲突和多个值被覆盖。
  • 我明白你在说什么。更新了我的答案。
  • 那不是 O(n2) 吗?
【解决方案2】:

Python dict 是具有唯一键的无序结构。 由于您需要第一次遇到的键的值 - 以相反的顺序迭代输入列表:

mylist = [('a', 0.01), ('b', 0.02), ('c', 0.03), ('a', 0.04)]
mydict = {t[0]:t[1] for t in mylist[::-1]}

print(mydict)

输出:

{'a': 0.01, 'c': 0.03, 'b': 0.02}

【讨论】:

  • 感谢您的回复,但我编辑了问题,因为我最初忘记提及我需要其他逻辑。也许我不能在一行中使用 dict 理解。
  • @JSStuball:为了澄清,当你说你需要 else 逻辑时,你需要它来产生不同的密钥吗?您是否需要以某种方式组合值?您只需要过滤掉重复项吗?你能稍微扩展一下吗?
猜你喜欢
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 2010-12-08
  • 2017-06-23
  • 2012-05-13
  • 1970-01-01
相关资源
最近更新 更多