python - 迭代一个 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)
想法?任何帮助,将不胜感激。
解决方案
您可以使用列表推导来实现此目的:
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']
推荐阅读
- ios - 试图阻止 iPhone 4 上的方向更改
- linux - Bash 脚本生成的不是 cat 的子进程
- c# - “无法使用实例引用访问成员,而是使用类型名称对其进行限定”并且我确实使用类型名称
- jquery - 删除索引大于点击的元素
- cloud - 恢复 Google Cloud 项目
- reactjs - 使用 Storyshot 渲染 React Portal 时出错
- amazon-redshift - 在 Pentaho 数据集成中使用 DISTSTYLE ALL 创建表会引发 DISTKEY 兼容性错误
- angular - 数据关闭模式在单击提交时无法以角度工作
- javascript - 在 $(".sim-row-edit").mousedown 上显示右键菜单
- android - E/BitmapFactory:无法解码流:java.io.FileNotFoundException for(没有这样的文件或目录)