首页 > 编程问答 >删除字典值中的列表元素会影响该字典中的其他值吗?

删除字典值中的列表元素会影响该字典中的其他值吗?

时间:2024-07-21 10:34:26浏览次数:15  
标签:python dictionary

我在 python 中有一个字典,看起来像这样

my_dict = {
    '100':[['a', [10], [5]]],
    '101':[['a', [10], [7]]],
    '102':[['a', [10], [11]]],
    '103':[['a', [10], [4]]], 
}

要创建 my_dict,

my_dict = dict()
id_nums = ['100', '101', '102', '103', ...]
for id in id_nums:
   info_list = list()
   ## code to populate info list
   # based on certain conditions
   if some_condition:
       info_list.insert(0, 'a')
       info_list.insert(1, list1) # list_1 is passsed from another function
   else:
       info_list.insert(0, 'a')
       info_list.insert(1, [])
   if other_condition:
       info_list.insert(2, list2) # list2 is being passed from other function
   else:
       info_list.insert(2, [])
   if id not in my_dict.keys():
       my_dict[id] = list()
   my_dict[id].append(info_list)

其中信息列表包含 ['a', [10], [x]。

我正在循环遍历中的所有键dict ,我的目标是删除每个值中第一个索引处的数字,即 10。为了实现这一点,我有:

for k in my_dict.keys():
    my_dict[k][1].remove(10)

当我执行上面的代码时,在第一个键(即“100”)处,删除方法也会从值中删除 10 my_dict 中的所有键。

任何人都可以帮助我理解为什么会发生这种情况吗?以及如何避免?

谢谢


发生这种情况的原因是,你所有的字典值都指向了 相同的 列表 [10] 在内存中。为了理解这一点,让我们分解一下你的代码:

  1. 创建列表: 当你运行 info_list.insert(1, list1) 时,你并没有创建一个新的列表 [10] 。相反,你在 info_list 中插入了 list1 的一个 引用 。如果 list1 在不同的迭代中没有改变,那么所有的 info_list 都会在索引 1 处包含对同一个列表对象的引用。

  2. 修改列表: 当你执行 my_dict[k][0][1].remove(10) 时,你正在修改这个共享列表对象。由于所有键都指向这个列表,所以更改在所有地方都可见。

如何避免这种情况:

你需要确保每个字典值都有自己的独立列表。你可以通过在每次迭代中创建一个新的列表来实现这一点:

for id in id_nums:
    info_list = list()
    # ... your code to populate info_list ...

    # 创建一个新的列表,而不是插入 list1
    if some_condition:
       info_list.insert(0, 'a')
       info_list.insert(1, list1.copy()) # 创建 list1 的副本
    else:
       # ... 
    # 对 list2 也做同样的事情

    # ... 你的剩余代码 ... 

通过使用 list1.copy() ,你创建了一个新的列表,其中包含 list1 中的相同元素。现在,对这个新列表的修改不会影响其他字典值。

另一种方法 是直接在 info_list 中创建列表,而不是插入外部列表:

if some_condition:
    info_list.insert(0, 'a')
    info_list.insert(1, [10])  # 直接创建一个新的 [10] 列表
else:
    # ...

选择哪种方法取决于你的具体情况和 list1 list2 是如何生成的。

标签:python,dictionary
From: 73625245

相关文章

  • Python 工程师对 3D 高斯溅射的介绍(第 1 部分)
    从Python工程师的角度理解和编写GaussianSplatting欢迎来到雲闪世界。2023年初,来自法国蔚蓝海岸大学和马克斯普朗克信息研究所的作者发表了一篇题为“用于实时场渲染的3D高斯溅射”的论文。¹该论文展示了实时神经渲染的重大进步,超越了NeRF等先前方法的实用性。²......
  • 使用Python读取PDF文件,部分内容显示为一串乱码。我应该如何恢复它?
    使用Python读取PDF文件,部分内容显示为一串乱码。我该如何恢复它?importfitzdoc=fitz.open("2303.11366v4.pdf")#downloadfromhttps://arxiv.org/pdf/2303.11366print(doc[2].get_text().split('Figure1')[0])我得到了这样的文字:<RXDUHLQWKHPLGGOHRIDURRP>@7DVN......
  • Python 迭代列表
    分配sum_extra给定列表test_grades收到的额外学分总额。满分是100分,所以超过100分都是额外分。对于给定程序,sum_extra是8,因为1+0+7+0是8。给定程序的示例输出:额外总和:8请原谅我,我是编码新手,而且真的很糟糕!这是我的代码(不起作用)请......
  • 计算机毕业设计Python+Spark新能源汽车推荐系统 汽车大数据 汽车数据分析 汽车可视化
    表2黄河交通学院本科毕业设计(论文)开题报告学生姓名刘丹杰专业班级20本大数据一班学号2080910T01521设计(论文)题目基于Hadoop的新能源汽车销售数据分析系统的设计与实现选题的目的和意义:选题目的:新能源汽车销售数据分析系统的设计与实现旨在利用Hadoop等大数......
  • 为什么我的 python 程序一直说没有名为“PIL”的模块?
    我正在pythonIDLEshell中工作,由于某种原因pyautogui.locateOnScreen将无法工作。这是我的代码:frompyautoguiimport*importpyscreezeimportpyautoguiimporttimeimportkeyboardimportrandomimportwin32api,win32conwhile1:ifpyautogui.locateOnS......
  • 我在 Python 时间格式化函数中遇到代码问题
    我一直在研究一个Python函数,将给定的秒数转换为可读的时间格式(HH:MM:SS)。该函数对于大多数测试用例都能正常工作,但对于一些特定的输入会失败。这是我编写的函数:defmake_readable(seconds):ifseconds<60:s1=secondsh1,m1=(0,0)return......
  • 《流畅的Python》第二版 第11章
     fromarrayimportarrayimportmathclassVector2d:__match_args__=('x','y')typecode='d'def__init__(self,x,y):self.__x=float(x)self.__y=float(y)@propertydefx(self)......
  • 《流畅的Python》第二版 第12章
       fromarrayimportarrayimportmathimportfunctoolsimportitertoolsimportoperatorimportreprlibclassVector:typecode='d'def__init__(self,components):self._components=array(self.typecode,components)......
  • 如何在Python中给jupyter单元标准输入?
    我正在尝试在接受用户输入的jupyter笔记本上运行一个程序,但我不知道如何让它读取标准输入。例如,如果我使用shift-enter:a=input()print(a)运行代码,则单元格指示它正在运行,但不接受我的输入。我如何让它接受输入?你遇到的问题是Jupyternotebook中的代码单元默认......
  • Python:如何从 csvreader 列表中删除括号和单引号?
    Pythonn00b在这里。尝试使用csvreader从文件导入数组并打印一个值,但它添加了括号和单引号。这是我的代码:importrandomimportcsvwithopen('crimes.csv','r')ascsvfile:crimes=list(csv.reader(csvfile))hello=["Hello","Greetings","Hi&q......