如何通过值删除列表的几个元素?

时间:2019-07-16 07:42:10

标签: python list redo

我有两个A和B列表。当我在A中找到一个B值时,我想删除A中的值。但是在python中没有“ redo”,这会引起问题。可能会有各种各样的编码,但是我想知道一种非常聪明,简单或Pythonic的编码。

为此,我需要“重做”,但是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.remove()方法在A中删除了“ Feb”之后,“ Mar”被跳过了。

由于有多种解决方案,因此我需要进一步说明我的情况。基本上我想保留A,因为A是带有长列表元素的引用。然后,在循环多个B的过程中,我想从A中删除B中的那些元素。因此,我需要保留A直到程序结束,然后删除属于任何B的元素。

4 个答案:

答案 0 :(得分:3)

您可以使用列表理解:

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

答案 1 :(得分: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”(索引0)不在列表B中

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

答案 2 :(得分:1)

使用set.difference

例如:

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

print(list(set(A).difference(set(B))))

输出:

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

答案 3 :(得分:0)

此问题在多个列表中的概括,以获取常见元素的列表:

l = [['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'], ['Feb', 'Mar', 'Apr'], ['Feb', 'Mar', 'Apr', 'Dec']]

list(set.intersection(*map(set, l)))

输出:

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