【问题标题】:how to remove several elements of a list by value? [duplicate]如何按值删除列表的多个元素? [复制]
【发布时间】:2023-10-03 11:02:01
【问题描述】:

我有两个 A 和 B 列表。当我在 A 中找到 B 的值时,我想删除 A 中的值。但是在 python 中没有“重做”,就会出现问题。可能有多种编码,但我想知道一个非常聪明或简单或 Python 的编码。

为此我需要“重做”,但 python 没有“重做”。

A = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
B = ['Feb', 'Mar', 'Apr']
for mon in A:
    if mon in B:
        A.remove(mon)
print(A)

返回 ['Jan', 'Mar', 'May', 'Jun']

删除 A 中的 'Feb' 后,由于 A.remove() 方法,跳过了 'Mar'。

我需要更多地解释我的案例,因为有很多种解决方案。基本上我想保留 A 因为 A 是带有长列表元素的引用。然后在许多 B 的循环过程中,我想从 A 中删除 B 中的那些元素。所以我需要保留 A 直到程序结束,删除属于任何 B 的元素。

【问题讨论】:

  • 解决了我的问题。但标题有点不同,所以我找不到。

标签: python list redo


【解决方案1】:

您可以使用列表推导:

[item for item in A if item not in B]

【讨论】:

  • 我同意这个答案,但是仅仅添加它是不好的,从你正在迭代的列表中添加或删除,它永远不会结束,我认为这就是你的原因有问题。
  • 这是一个答案。但是在扩展(编辑)我的问题之后,制作一个新列表而不是保留 A 可能会很麻烦。在我看来,Sukrit 的解决方案 [in duplicate page((*.com/questions/18194968/… 看起来最好,它只将 A 更改为A[:] 的副本。我不确定那里有任何弱点。
  • 如果您不想设置新列表,您可能需要使用A = [item for item in A if item not in B]
【解决方案2】:

遍历列表 B 中的项目:

A = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
B = ['Feb', 'Mar', 'Apr']

for item in B:
    if item in A:
        A.remove(item)

print (A)

输出:

['Jan', 'May', 'Jun']

注意:

您的代码中发生了什么,您正在迭代列表中的项目 从中删除项目。 for 循环继续它的 从它所在的索引进行迭代。 但是如果您删除项目 从列表中,您已将您的项目移至 idx -1,因为它 “跳过”列表中的一些项目 A

例子:

1.iter: 'Jan' (index 0) 它不在列表 B 中

2.iter:'Feb'(索引 1)它在列表 B 中,从列表 A 中删除 'Feb',删除项目后,在索引 1 处现在您将拥有 'Mar',但迭代继续的索引是2,因为它“跳过”'Mar'

【讨论】:

    【解决方案3】:

    使用set.difference

    例如:

    A = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
    B = ['Feb', 'Mar', 'Apr']
    
    print(list(set(A).difference(set(B))))
    

    输出:

    ['Jan', 'May', 'Jun']
    

    【讨论】:

      【解决方案4】:

      在多个列表中对这个问题进行概括以获得共同元素的列表:

      l = [['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'], ['Feb', 'Mar', 'Apr'], ['Feb', 'Mar', 'Apr', 'Dec']]
      
      list(set.intersection(*map(set, l)))
      

      输出:

      ['Feb', 'Apr', 'Mar']
      

      【讨论】: