gpt4 book ai didi

Python:难以过滤掉包含某些子字符串的字符串

转载 作者:太空宇宙 更新时间:2023-11-03 12:38:45 24 4
gpt4 key购买 nike

我有一个要过滤的字符串列表。如果它包含单词 blahblah,那么我想保留它。我尝试了第一种方法,并且一遍又一遍地检查了我的代码,但我不知道为什么它会保留一些没有“blahblah”一词的字符串。但是,我尝试了第二种方法,它奏效了。我很好奇为什么第一种方法不起作用。

第一种方法:

for item in my_list:
if 'blahblah' not in item:
my_list.remove(item)

第二种方法:

my_new_list = []
for m in my_list:
if 'blahblah' in m:
my_new_list.append(p)

第二种方法给了我想要的。我煞费苦心地检查了从第二个列表生成的列表的每个元素。

  1. 为什么第一种方法不能正常工作?
  2. 如果我使用第二种方法,如果我有一个非常大的列表,我的代码运行速度会变慢吗?

最佳答案

要回答第一个问题,这是因为在遍历列表时,Python 会在内部跟踪当前迭代到达的索引,当您从列表中删除项目时,它会移动元素的索引,在删除的元素,向左移动 1(将这些索引减少 1),因此在下一次迭代中,您可能最终会跳过一个元素(由于这种移动)。


要回答第二个问题,它应该比删除方法更快,因为 .remove() 是一个 O(n) 操作,它需要找到要删除的元素然后删除它,与此相比,.append() 会更快。

更快一点的方法是使用列表理解 -

my_new_list = [m for m in my_list if 'blahblah' in m]

如果你想改变my_list,你可以在赋值的左边使用[:] -

my_list[:] = [m for m in my_list if 'blahblah' in m]

演示 -

>>> my_list = ['blahblah','asdas']
>>> [m for m in my_list if 'blahblah' in m]
['blahblah']

两种方法的时序比较(如评论中所要求)-

In [4]: def func1():
...: my_list = ['blahblah' for _ in range(100)]
...: my_list[:] = [m for m in my_list if 'blahblah' in m]
...:

In [5]: def func2():
...: my_list = ['blahblah' for _ in range(100)]
...: new_list = [m for m in my_list if 'blahblah' in m]
...:

In [6]: %timeit func1()
100000 loops, best of 3: 13.9 µs per loop

In [7]: %timeit func2()
100000 loops, best of 3: 13.2 µs per loop

In [8]: %timeit func1()
100000 loops, best of 3: 13.9 µs per loop

In [9]: %timeit func2()
100000 loops, best of 3: 13.2 µs per loop

In [10]: %timeit func1()
100000 loops, best of 3: 13.8 µs per loop

In [11]: %timeit func2()
100000 loops, best of 3: 13.3 µs per loop

关于Python:难以过滤掉包含某些子字符串的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32804824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com