[英]Dictionary updating all keys with nested values
我正在尝试替换字典中嵌套列表索引处的值。 字典是这样的。
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)
您不需要遍历字典的键来找到相应的值。
def ratingUpdate(key, index, rate, ratings):
ratings[key][index]=rate
另请参阅有关 dicts 的文档: https ://docs.python.org/3/tutorial/datastructures.html#dictionaries
至于为什么每个列表都在更新,我们需要看更多的代码来确定。 最有可能的是,dict 上的每个条目都指向同一个列表,而不是每个条目都有不同的列表。
如果您创建字典的方式与您在问题中发布的方式相同,那么它应该可以按您的预期工作(即列表是独立的)。
但是,如果您对所有键使用相同的列表实例,则所有键都指向相同的列表内容,这就是您观察到的行为的时候。
例如:
ratings = dict.fromkeys(['Bill','Sal','Pam'],[0,0,0,0,0,0])
会将相同的列表与所有键相关联。
您可以通过打印它们的 id 来检查它们是否都是相同的列表:
print(*map(id,ratings.values()))
如果它们都相同,那么您的键都指向同一个列表实例,但是您得到的结果几乎可以保证就是这种情况。
您已经使用引用相同list
值创建了字典。
想必,你已经做到了;
inputs = [0, 0, 0, 0, 0, 0]
same_list = {'Bill': inputs, 'Sal': inputs, 'Pam': inputs}
您需要在不引用相同list
情况下创建ratings
字典。
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]}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.