当我在 Python 中编写代码时,我经常需要根据某些条件从列表或其他序列类型中删除项目。我还没有找到优雅高效的解决方案,因为从您当前正在迭代的列表中删除项目是不好的。例如,您不能这样做:
for name in names:
if name[-5:] == 'Smith':
names.remove(name)
我通常会做这样的事情:
toremove = []
for name in names:
if name[-5:] == 'Smith':
toremove.append(name)
for name in toremove:
names.remove(name)
del toremove
这是低效的,相当丑陋的并且可能有错误(它如何处理多个“John Smith”条目?)。有没有人有更优雅的解决方案,或者至少是更有效的解决方案?
使用字典的那个怎么样?
最佳答案
完成过滤的两种简单方法是:
使用
过滤器
:names = filter(lambda name: name[-5:] != "Smith", names)
使用列表推导:
names = [name for name in names if name[-5:] != "Smith"]
请注意,这两种情况都会保留谓词函数评估为 True
的值,因此您必须颠倒逻辑(即您说“保留不姓史密斯的人”而不是“删除姓史密斯的人”)。
编辑有趣...两个人分别发布了我在发布我的建议时提出的两个答案。
关于python - 在 Python 中从序列中删除项目的优雅方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18418/