2016-11-09 87 views
0

當給定字典(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)]} 

該定義函數的外觀如何?謝謝

+0

除了調用列表的append()方法嗎? –

+0

如果已經存在關鍵字和值,那麼不允許重複(不添加信息,因爲它已經存在) –

+0

它看起來好像你的值是列表。你需要維持秩序還是適合'套'?當然,這也限制了可哈希類型的值。 – tdelaney

回答

0

使用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')])}) 
+1

一個很好的答案,但只適用於值可哈希值。 – tdelaney

+0

@tdelaney如果這成爲一個問題,例如如果OP想要插入列表,他/她應該轉換爲可排除的等價物。 –

1

我覺得蠻力方法是最好的。它還是短而直向前

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')]} 
+0

我以爲字典不能使用.append()命令,我得到的'builtin_function_or_method'對象的TypeError不是可訂閱的 –

+0

字典的值是列表。 'd [key]'得到列表值,'d [key] .append()'追加到列表中。我添加了一些測試,他們爲我運行,你的代碼是一樣的嗎?哪一行失敗?你可以用我發佈的代碼重現問題,並顯示你是如何做到的?我們可以弄清楚這一點。 – tdelaney

+0

我只有一個失敗的測試用例,它看起來像唯一的問題是值的排序,可以使用sort()命令或其他東西 –

0

可能失去了一些東西,但速度更快的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) 

或更慢,如果檢查(要求權限然後做)?

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