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