【问题标题】:how to append a new value to the existing dict key without overwrite如何在不覆盖的情况下将新值附加到现有的 dict 键
【发布时间】:2014-04-04 11:42:18
【问题描述】:

标题描述了问题,这是我尝试过的,但没有给我预期的结果..问题出在哪里?

for name in file:              
  if name in list:
    if dict.has_key(param):
      dict[param] = [dict[param],name]
    else:
      dict[param] = name

预期输出:

dict = {
'param1': ['name11', 'name12', 'name13'],
'param2': ['name21', 'name22', 'name23'],
.
.
.
}

【问题讨论】:

  • 好吧,对于初学者来说,你的字典不是有效的 python。
  • @msvalkon 忘了分号
  • 那不让它有效。
  • 它实际上降低了它的有效性。
  • 尝试将您的dict={...} 复制粘贴到解释器中。

标签: python dictionary hash


【解决方案1】:

您需要将这些名称附加到列表中。以下是一个幼稚的示例,可能会中断。

for name in file:              
    if name in list:
        if dict.has_key(param):
            dict[param].append(name)
        else:
            dict[param] = [name]

或者,如果您想更简洁一些,可以使用collections.defaultdict。如果你问我,这是pythonic的方式。

d = collections.defaultdict(list)
for name in file:
    if name in lst: # previously overwrote list()
        d[param].append(name)

不要用您自己的变量覆盖内置的dict()list() 函数。

【讨论】:

  • 我认为 append 不适用于 dicts,至少在我尝试这个时它给了我一个错误,但现在它可以工作了,可能是因为我在 else 之后没有尝试使用 append条件
  • @Streak else 子句将name 包装在[] 中,从而将其变成包含单个元素的列表。这不是很漂亮,我会使用第二种解决方案。
  • 我还要补充一点,请不要用你自己的变量覆盖内置的list()函数
  • 对于第一个答案,您可以避免使用else 和使用.get 方法的hack,但使用defaultdict 是首选的pythonic 方式。
  • @msvalkon 完全同意,这正是引入 defaultdict 的目的。如果我必须处理在其他地方定义的对象,我只会使用 get 技巧;例如如果 dict 是 mongodb 查询的输出。
【解决方案2】:

您正在寻找多映射,即没有键 -> 值关系但有键 -> 多个值的映射或字典,请参阅:

Is there a 'multimap' implementation in Python?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多