繁体   English   中英

字典用嵌套值更新所有键

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM