假设这是我的清单:
cnf=[(1, 2, -3), (-1, -2, -3), (-1, 2, 3), (4, -6), (5, -6), (-4, -5, 6), (6, 7)]
我想从'-3'
中删除cnf
个元素。立即制作cnf
:
[(1, 2), (-1, -2), (-1, 2, 3), (4, -6), (5, -6), (-4, -5, 6), (6, 7)]
for i in cnf:
i=list(i)
if i.count( -3):
print(type(i))
print(i)
i.remove(-3)
print(cnf)
输出是这样的:
<class 'list'>
[1, 2]
<class 'list'>
[-1, -2]
[(1, 2, -3), (-1, -2, -3), (-1, 2, 3), (1, -2, 3), (4, -6), (5, -6), (-4, -5, 6), (6, 7), (-6, -7)]
因此删除了值-3
,但未更新cnf
列表。我该怎么办?
答案 0 :(得分:2)
您可以使用filter
:
cnf=[(1, 2, -3), (-1, -2, -3), (-1, 2, 3), (4, -6), (5, -6), (-4, -5, 6), (6, 7)]
new_list = [tuple(filter(lambda x:x != -3, i)) for i in cnf]
输出:
[(1, 2), (-1, -2), (-1, 2, 3), (4, -6), (5, -6), (-4, -5, 6), (6, 7)]
答案 1 :(得分:1)
在您的代码中,当您执行i=list(i)
时,您将使用新的列表对象引用i
变量,这就是您的更改未反映在原始列表中的原因。您可以使用以下代码将基于索引的更新元组替换为:
for i in range(len(cnf)):
cnf[i] = tuple(x for x in cnf[i] if x!=-3)
OR,作为替代方案,您可以使用 list comprehension 表达式来获得所需的结果:
>>> cnf = [(1, 2, -3), (-1, -2, -3), (-1, 2, 3), (4, -6), (5, -6), (-4, -5, 6), (6, 7)]
>>> [tuple(y for y in x if y!=-3) for x in cnf]
[(1, 2), (-1, -2), (-1, 2, 3), (4, -6), (5, -6), (-4, -5, 6), (6, 7)]
注意: list.reomve(x)
方法仅删除列表中第一次出现的x
而不是全部。对于您的情况,这不是您想要的方法。
答案 2 :(得分:1)
您的i=list(i)
只是从元组中列出一个列表。这个新列表与原始元组和包含该元组的列表没有真正的连接。关键是明确地将新元组重新分配给列表:
for i, nums in enumerate(cnf):
if -3 in nums:
nums = list(nums)
nums.remove(-3)
cnf[i] = tuple(nums)
由于元组是不可变的,因此增加了复杂性,因此我们必须先将元组转换为列表,然后才能删除-3
元素。在上面的代码中,我再次从修改后的列表中创建一个元组,然后将其重新插入cnf
。此外,上述i
是cnf
的循环索引。