1

我有两个 A 和 B 列表。当我在 A 中找到 B 的值时,我想删除 A 中的值。但是在 python 中没有“重做”,就会出现问题。可能有多种编码,但我想知道一个非常聪明或简单或 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 中删除“Feb”后,由于 A.remove() 方法,“Mar”被跳过。

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

4

4 回答 4

3

您可以使用列表推导:

[item for item in A if item not in B]
于 2019-07-16T07:45:09.207 回答
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'

于 2019-07-16T07:45:20.540 回答
1

利用set.difference

前任:

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

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

输出:

['Jan', 'May', 'Jun']
于 2019-07-16T07:46:48.007 回答
0

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

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

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

输出:

['Feb', 'Apr', 'Mar']
于 2019-07-16T07:53:39.837 回答