我正在嘗試替換字典中嵌套串列索引處的值。字典是這樣的。
ratings ={'Bill': [0,0,0,0,0,0], 'Sal': [0,0,0,0,0,0], 'Pam': [0,0,0,0,0,0]}
我正在構建一個傳入密鑰的函式。這個函式應該遍歷字典來找到傳入的鍵。然后它應該更新傳入的索引參考的值到傳入的速率引數。
不是更新傳入的鍵/值串列對,而是更新每個鍵/(嵌套)值對。
我只需要它更新傳遞給函式的鍵/值對。
下面是代碼
key passed in was Bill
index passed in was 2
rate passed in wad 3
def ratingUpdate(key, index, rate, ratings):
for k in ratings.keys():
if key == k:
ratings[key][index]=rate
break
else:
continue
Output Expected: 'Bill': [0,0,3,0,0,0], 'Sal': [0,0,0,0,0,0], 'Pam': [0,0,0,0,0,0]
Output Actual: 'Bill': [0,0,3,0,0,0], 'Sal': [0,0,3,0,0,0], 'Pam': [0,0,3,0,0,0]
字典構造如下
用戶是一個集合
zeroRaitings 是一個整數串列
ratingsDict = dict.fromkeys(users, zeroRaitings)
此函式用于決議檔案以更新 ratingsDict
f = open('sample.txt', "r")
the_file = f.readlines()
for line in range(0, len(the_file)-1, 3):
key = the_file[line].rstrip()
#books is a secondary list where the index comes from
index = books.index(the_file[line 1].rstrip())
rate = int(the_file[line 2].rstrip())
ratingUpdate(key, index, rate, ratingsDict)
uj5u.com熱心網友回復:
您不需要遍歷字典的鍵來找到相應的值。
def ratingUpdate(key, index, rate, ratings):
ratings[key][index]=rate
另請參閱有關 dicts 的檔案:https ://docs.python.org/3/tutorial/datastructures.html#dictionaries
至于為什么每個串列都在更新,我們需要看更多的代碼來確定。最有可能的是,dict 上的每個條目都指向同一個串列,而不是每個條目都有不同的串列。
uj5u.com熱心網友回復:
如果您創建字典的方式與您在問題中發布的方式相同,那么它應該可以按您的預期作業(即串列是獨立的)。
但是,如果您對所有鍵使用相同的串列實體,則所有鍵都指向相同的串列內容,這就是您觀察到的行為。
例如:
ratings = dict.fromkeys(['Bill','Sal','Pam'],[0,0,0,0,0,0])
會將相同的串列與所有鍵相關聯。
您可以通過列印它們的 id 來檢查它們是否都是相同的串列:
print(*map(id,ratings.values()))
如果它們都相同,那么您的鍵都指向同一個串列實體,但是您得到的結果幾乎可以保證就是這種情況。
uj5u.com熱心網友回復:
您已經創建了字典,其中的值參考了相同的list.
想必,你已經做到了;
inputs = [0, 0, 0, 0, 0, 0]
same_list = {'Bill': inputs, 'Sal': inputs, 'Pam': inputs}
您需要創建您的ratings字典而不參考相同的list.
different_list = {'Bill': [0, 0, 0, 0, 0, 0], 'Sal': [0, 0, 0, 0, 0, 0], 'Pam': [0, 0, 0, 0, 0, 0]}
這里有一個例子可以幫助你更好地理解
inputs = [0, 0, 0, 0, 0, 0]
# All your values point to the same list, they are not individual per key
same_list = {'Bill': inputs, 'Sal': inputs, 'Pam': inputs}
different_list = {'Bill': [0, 0, 0, 0, 0, 0], 'Sal': [0, 0, 0, 0, 0, 0], 'Pam': [0, 0, 0, 0, 0, 0]}
def rating_update(key, index, rate):
if key in same_list:
same_list[key][index] = rate
different_list[key][index] = rate
rating_update('Bill', 2, 3)
same_list
#{'Bill': [0, 0, 3, 0, 0, 0], 'Sal': [0, 0, 3, 0, 0, 0], 'Pam': [0, 0, 3, 0, 0, 0]}
inputs
#[0, 0, 3, 0, 0, 0]
different_list
#{'Bill': [0, 0, 3, 0, 0, 0], 'Sal': [0, 0, 0, 0, 0, 0], 'Pam': [0, 0, 0, 0, 0, 0]}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/334494.html
