如何在Python中更改字典列表中的值

4

我是一名有用的助手,可以帮您进行文本翻译。

我有一个包含特定值的列表字典。如何更新列表中的值,而不影响其他键的相同位置的值?

我的代码:

open = []
high = []
low = []
close = []  

ohlc_list = {}

for i in range(0,20):
   open.append(0)
   close.append(0)
   high.append(0)
   low.append(0)


for x in range(0,5):
   ohlc_list[x] = [open,high,low,close] 

ohlc_list[1][1][3] = 0  

这将更改所有键的高级列表(1)的第4个(3 + 1)元素,而不仅仅是更改键1的元素。

我想仅更改与特定键相关联的列表的值。我该如何做到这一点?


“open, high, low, close”是数据结构的名称 - 它们指向完全相同的数据。您添加了此引用5次。如果更改一个引用后面的数据,则所有其他引用都指向相同的数据,并且您会看到“相同”的更改。您的错误在于一开始重复添加相同的引用。 - Patrick Artner
2个回答

3
for x in range(0, 5):
   ohlc_list[x] = [open , high , low, close]

这不是你想要的功能,它会创建5个指向同一个4个列表的引用,并将这些引用保存在不同的键下。

可以使用以下循环来展示:

for value in ohlc_list.values():
    print([id(inner_list) for inner_list in value])

# [2446702057416, 2446702057544, 2446692440648, 2446702057480]
# [2446702057416, 2446702057544, 2446692440648, 2446702057480]
# [2446702057416, 2446702057544, 2446692440648, 2446702057480]
# [2446702057416, 2446702057544, 2446692440648, 2446702057480]
# [2446702057416, 2446702057544, 2446692440648, 2446702057480]

我们可以看到,所有的内部列表都具有相同的id,这意味着它们都引用内存中的同一位置(故意过于简化)。
你想要的是这些列表的五个副本。你可以使用空切片([:])或者copy来实现:
for x in range(0, 5):
   ohlc_list[x] = [open[:], high[:], low[:], close[:]] 

如果我们再次打印内部列表的所有ID,我们会发现现在我们实际上获得了不同的内存列表:
# [2592165177544, 2592165177480, 2592165177416, 2592165177352]
# [2592165177672, 2592165177736, 2592165177800, 2592165177864]
# [2592165177992, 2592165178056, 2592165178120, 2592165178184]
# [2592165178312, 2592165178376, 2592165178440, 2592165178504]
# [2592165178632, 2592165178696, 2592165178760, 2592165178824]

这个可以运行。非常感谢指出我的错误 :) - Parva Patel

1

您需要复制这些列表

from copy import copy

然后在你的循环中:

ohlc_list[x] = [copy(open), copy(high), copy(low), copy(close)]

否则,您只是将同一列表对象添加到所有条目中。

这个可行。非常感谢指出我的错误 :) - Parva Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接