Python 如何删除列表中的元组元素并访问更新的列表?

Python 如何删除列表中的元组元素并访问更新的列表?,python,list,tuples,Python,List,Tuples,假设这是我的列表: cnf=[(1, 2, -3), (-1, -2, -3), (-1, 2, 3), (4, -6), (5, -6), (-4, -5, 6), (6, 7)] 我想从cnf中删除'-3'元素。现在制作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

假设这是我的列表:

cnf=[(1, 2, -3), (-1, -2, -3), (-1, 2, 3), (4, -6), (5, -6), (-4, -5, 6), (6, 7)]
我想从
cnf
中删除
'-3'
元素。现在制作
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)]

[1, 2]
[-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
列表不会更新。我应该怎么做?

在您的代码中,当您执行
I=list(I)
时,您使用一个新的list对象引用
I
变量,这就是为什么您的更改没有反映在原始列表中。您可以使用以下代码替换基于索引的更新元组,如下所示:

for i in range(len(cnf)):
    cnf[i] = tuple(x for x in cnf[i] if x!=-3)
或者,您也可以使用下面的理解表达式来获得所需的结果,如下所示:

>>> 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)]

注意:方法仅删除列表中第一次出现的
x
,而不是全部。对于您的情况,这不是您想要的方法。

在您的代码中,当您执行
i=list(i)
时,您使用一个新的list对象引用
i
变量,这就是您的更改没有反映在原始列表中的原因。您可以使用以下代码替换基于索引的更新元组,如下所示:

for i in range(len(cnf)):
    cnf[i] = tuple(x for x in cnf[i] if x!=-3)
或者,您也可以使用下面的理解表达式来获得所需的结果,如下所示:

>>> 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)]
注意:方法仅删除列表中第一次出现的
x
,而不是全部。对于您的情况,这不是您想要的方法。

您的
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

的循环索引,您的
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

的循环索引,您可以使用
过滤器

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)]

您可以使用
过滤器

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)]