2017-05-11 180 views
0

的字典替換值我有一本字典,像這樣:在列表/元組蟒蛇

d = {} 
d['key1'] = [('tuple1a', 'tuple1b', ['af1', 'af2', 'af3']), 
      ('tuple2a', 'tuple2b', ['af4', 'af5', 'af6']), 
      ('tuple3a', 'tuple3b', ['af7', 'af8', 'af9'])]  

我想編寫一個函數,讓我更新值(例如['af1','af2','af3'])的列表部分。下面的代碼的工作原理是不同的值進行過濾,以獲得正確的列表值的範圍內:

def update_dict(dictionary, key, tuple_a, tuple_b, new_list=None): 

    for k,v in dictionary.items(): 
     if key in k: 
      for i in v: 
       if tuple_a in i: 
        if tuple_b in i: 
         #di.update(i[2], new_lst) #this is what I'd like to do but can't get the right syntax 
    return dictionary 

我想添加類似di.update(i[2], new_lst)我的問題是如何以新的清單僅更新列表值?

+0

這是一個元組字典。你不能更新元組。但我想知道你可以單獨更改引用列表。 – Dandekar

+0

因爲元組是不可變的,所以我可以像這樣重新創建字典:'d.update({k:[(tuple_a,tuple_b,aod_nt)]})'但它只創建一個關鍵字:值對的字典。我怎樣才能保存字典中的其他值? – e9e9s

回答

1

由於元組是一個不可變類型,所以不能更改元組中的單個條目。解決方法是使用元組中的元素創建一個列表,然後從列表中創建一個元組。您也將有新的元組分配給定元素在父列表,像這樣:

for k,v in dictionary.items(): 
    if key in k: 
     for n,tpl in enumerate(v): 
      if tuple_a in tpl and tuple_b in tpl: 
       v[n] = tuple(list(tpl)[:-1] + [new_list]) 

(我是你的榜樣有點困惑,其中的變量稱爲tuple_a和tuple_b實際上串。最好稱它們爲name_a和name_b或類似的。)

1

正如其他提到的,你不能改變元組中的單個條目。但是元組中的列表仍然是可變的。

>>> my_tuple = ('a', 'b', 'c', [1, 2, 3, 4, 5], 'd') 
>>> my_tuple 
('a', 'b', 'c', [1, 2, 3, 4, 5], 'd') 
>>> my_tuple[3].pop() 
5 
>>> my_tuple[3].append(6) 
>>> my_tuple 
('a', 'b', 'c', [1, 2, 3, 4, 6], 'd') 

所以你想要的東西,你可以這樣做:

>>> my_tuple = ('a', 'b', 'c', [1, 2, 3, 4, 5], 'd') 
>>> newList = [10, 20, 30] 
>>> 
>>> del my_tuple[3][:]  # Empties the list within 
>>> my_tuple 
('a', 'b', 'c', [], 'd') 
>>> my_tuple[3].extend(newList) 
>>> my_tuple 
('a', 'b', 'c', [10, 20, 30], 'd') 

因此,在你的代碼

del i[2][:] 
i[2].extend(new_list) 

更換# di.update(i[2], new_lst)我認爲這是更快了。