【问题标题】:"Updating" a Dictionary“更新”字典
【发布时间】:2017-03-23 19:30:26
【问题描述】:

当给定一个字典(db)时,有没有办法向字典中已经存在的键添加值。因此,如果键不存在,则更新或简单地添加键及其值:

说:

db = {'John': [('Brown', 'Blue', 180)]}
def add_anything(db,Name(the key), HairColor(value), EyeColor(value), Height(value):
add_anything(db, "John", "Black", "Red", "160")

当我更新数据库时,返回的数据库会回馈:

{'John': [('Brown', 'Blue', 180),('Black', 'Red', 160)]}

这个定义函数会是什么样子?谢谢

【问题讨论】:

  • 除了调用列表的append()方法吗?
  • 如果键和值都已经存在,则不允许重复(不添加信息,因为它已经存在)
  • 看起来你的值是列表。您需要维持秩序还是set 合适?当然,这也将值限制为可散列类型。
  • 可能有数百个问题已经解决了这个问题和类似问题。尝试寻找它们。

标签: python dictionary


【解决方案1】:

使用set 来防止重复但以丢失订单为代价,我认为这并不重要:

>>> from collections import defaultdict
>>> db = defaultdict(set)
>>> db['John'].add(('Brown', 'Blue', 180))
>>> db
defaultdict(<type 'set'>, {'John': set([('Brown', 'Blue', 180)])})
>>> db['John'].add(('Brown', 'Blue', 180))
>>> db
defaultdict(<type 'set'>, {'John': set([('Brown', 'Blue', 180)])})
>>> db['John'].add(("Black", "Red", "160"))
>>> db['Jane'].add(("Red", "Gree", "140"))
>>> db
defaultdict(<type 'set'>, {'Jane': set([('Red', 'Gree', '140')]), 'John': set([('Brown', 'Blue', 180), ('Black', 'Red', '160')])})

【讨论】:

  • 一个很好的答案,但只有在值是可散列的情况下才有效。
  • @tdelaney 如果这成为一个问题,例如如果 OP 想要插入列表,他/她应该转换为可哈希的等价物。
【解决方案2】:

我认为蛮力方法是最好的。它仍然简短而直接

def add_anything(d, key, *value):
    if key in d:
        if value not in d[key]:
            d[key].append(value)
    else:
        d[key] = [value]

运行一些测试

>>> add_anything(d, 'bob', 'Brown', 'Blue', '180')
>>> d
{'bob': [('Brown', 'Blue', '180')]}
>>> add_anything(d, 'bob', 'Brown', 'Blue', '180')
>>> d
{'bob': [('Brown', 'Blue', '180')]}
>>> add_anything(d, 'bob', 'Brown', 'Blue', '666')
>>> d
{'bob': [('Brown', 'Blue', '180'), ('Brown', 'Blue', '666')]}
>>> add_anything(d, 'jane', 'Brown', 'Blue', '666')
>>> d
{'jane': [('Brown', 'Blue', '666')], 'bob': [('Brown', 'Blue', '180'), ('Brown', 'Blue', '666')]}

【讨论】:

  • 我认为字典不能使用 .append() 命令,我得到一个 TypeError of 'builtin_function_or_method' object is not subscriptable
  • 字典的值是列表。 d[key] 获取列表值,d[key].append() 追加到列表中。我添加了一些测试,它们为我运行,你的代码是一样的吗?哪条线路失败?你能用我发布的代码重现问题并展示你是如何做到的吗?我们可以解决这个问题。
  • 我只有一个失败的测试用例,看起来唯一的问题是值的顺序,可以使用 sort() 命令或其他方法
  • 我将示例更改为将任意数量的参数作为一个元组而不是单个元组,您的示例对我有用。关于“'builtin_function_or_method'对象的TypeError不可下标”-如果您在函数调用中使用方括号就会发生这种情况......例如add_anything['bob', 1,2,3]。得到该错误的确切行是什么?
  • 对每个值进行排序?是的,你可以这样做。一种选择是在d[key].append(value) 之后立即执行d.sort()
【解决方案3】:

这里可能遗漏了一些东西,但是更快的 try/catch(先做然后请求原谅)?

d = {'John': [('Brown', 'Blue', 180)]}

def add_to_dict(d, k, v):
    try:
        d[k].append(v)
    except KeyError:
        d[k] = [v]
    return d

print(d)
add_to_dict(d, "John", ('Black', 'Red', 160))
print(d)
add_to_dict(d, "Jim", ('Blond', 'Green', 200))
print(d)
add_to_dict(d, "Jim", ('Blond', 'Green', 220))
print(d)

或者更慢的 if 检查(请求许可然后做)?

def add_to_dict(d, k, v):
    if k in d.keys():
        d[k].append(v)
    else:
        d[k] = [v]
    return d

【讨论】:

    猜你喜欢
    • 2022-11-08
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多