首页 > 解决方案 > 迭代一个 Python 列表并根据另一个列表过滤元素

问题描述

我有两个清单。第一个列表包含所有名称。

firstList = ["mike", "mary", "steve", "jane"]

第二个列表包含我要过滤的名称。

filteredList = ["mike", "mary"]

我想排除过滤列表中的所有名称,以便最终列表如下所示:

finalList = ["steve","jane"]

这些名称是示例,条目的数量会有所不同,并且需要是动态的。

我从这个开始,但它没有运行:

for b in firstList:
    for s in filteredList:
        finalList = firstList[firstList[b != s]]
        print(finalList)

想法?任何帮助,将不胜感激。

标签: pythonpandasloopsfor-loopiteration

解决方案


您可以使用列表推导来实现此目的:

firstList = ["mike", "mary", "steve", "jane"]
filteredList = ["mike", "mary"]

finalList = [name for name in firstList if name not in filteredList]
# where `finalList` will hold: ['steve', 'jane']

在这里,您正在迭代firstList并检查 中的每个项目是否存在filteredList。如果不存在,请考虑将其作为您的新列表。

您还可以使用set()以下方式实现此目的:

set(firstList) - set(filteredList)
# returns: set(['steve', 'jane'])

# if it is must for you to obtain the "finalList" as `list`, 
# you can type-cast it as:
#     finalList = list(set(firstList) - set(filteredList))

但是通过使用 set,您将无法在firstList. 并且它将仅包含唯一项目,即重复项目将被删除。例如:如果您的“firstList”将包含["mike", "mike", "mary", "steve", "jane"],finalList将只包含 single"mike"而在我上面提出的基于列表理解的解决方案中,您会看到"mike"两次。


在您共享的代码中,它可以固定为:

finalList = []

for b in firstList:
    if b not in filteredList: # checking the presence of "b" in "filteredList"
        finalList.append(b)

# where `finalList` will contain: ['steve', 'jane']

推荐阅读