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

时间:2017-10-22 19:57:34

标签: python list tuples

假设这是我的清单:

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列表。我该怎么办?

3 个答案:

答案 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。此外,上述icnf的循环索引。