列表莫名自动变更排查及三列表匹配赋值代码问题咨询
嘿,来解决你的两个Python列表问题!
一、列表没碰它却自己变了?这是引用传递的锅!
这种情况我也踩过坑——Python里列表是可变对象,当你把列表赋值给另一个变量、或者传给函数时,你并没有复制一个新列表,只是给同一个列表对象多了个“别名”。举个直观的例子:
my_list = [1, 2, 3] another_list = my_list # 只是复制了引用,俩变量指向同一个列表 another_list.append(4) print(my_list) # 结果是 [1,2,3,4],原列表被悄悄改了!
怎么解决?
- 单层列表:用切片
new_list = original[:]或者original.copy()创建独立副本 - 像你代码里的嵌套列表(列表套列表):得用
deepcopy把所有层级的对象都复制一遍,不然嵌套的子列表还是共享引用:
import copy safe_copy = copy.deepcopy(original_list)
这样改新列表就完全不会影响原列表了。
二、list1和comparsion_list匹配并导入list2的实现
先看你的需求:把list1中和comparsion_list匹配上的项加到list2里。我先补全你没写完的comparsion_list(假设第二个元素是['item4'],和list1的结构对齐),然后写匹配逻辑——我默认是按每个子列表的第一个元素(比如item1、item3)来匹配,要是你的匹配规则不一样,后面我也给你改的思路~
完整可运行代码:
import copy list1 = [['item1', ['item2'], '0', '0'], ['item3', ['item4'], '107', '2'], ['item4.5', ['item5', 'item4.5 aaa'], '120', '2'], ['item6', ['item6 item6 aaa'], '127', '1'], ['item7', ['item7 item7 aaa'], '129', '1']] # 补全你提供的comparsion_list comparsion_list = [['item1', ['item2'], 'unknown'], ['item3', ['item4']]] list2 = [] # 先把comparsion_list里要匹配的键提取成集合,查找更快 match_targets = {item[0] for item in comparsion_list} # 遍历list1,匹配成功就加到list2(用deepcopy避免后续修改影响list2) for item in list1: if item[0] in match_targets: list2.append(copy.deepcopy(item)) # 看看结果 print(list2)
运行结果:
[['item1', ['item2'], '0', '0'], ['item3', ['item4'], '107', '2']]
要是匹配规则不是第一个元素?
比如你想匹配子列表(item[1]),那可以把列表转成元组(因为列表不能放进集合),然后匹配:
# 提取comparsion_list里的子列表,转成元组存进集合 match_sub_lists = {tuple(item[1]) for item in comparsion_list} for item in list1: if tuple(item[1]) in match_sub_lists: list2.append(copy.deepcopy(item))
内容的提问来源于stack exchange,提问作者Andreas Bekkelund
相关产品推荐
相关产品推荐

