有没有更好的方法在字符串列表上使用strip()? - 蟒蛇

时间:2012-08-29 16:48:49

标签: python string list iterator strip

现在我一直试图在字符串列表上执行strip(),我这样做了:

i = 0
for j in alist:
    alist[i] = j.strip()
    i+=1

有更好的方法吗?

4 个答案:

答案 0 :(得分:28)

您可能不应该使用list作为变量名称,因为它是一种类型。无论:

list = map(str.strip, list) 

这会将函数str.strip应用于list中的每个元素,返回一个新列表,并将结果存储回list

答案 1 :(得分:18)

您可以使用列表推导

stripped_list = [j.strip() for j in initial_list]

答案 2 :(得分:8)

有关性能的一些有趣的讨论发生在这里,所以让我提供一个基准:

http://ideone.com/ldId8

noslice_map              : 0.0814900398254
slice_map                : 0.084676027298
noslice_comprehension    : 0.0927240848541
slice_comprehension      : 0.124806165695
iter_manual              : 0.133514881134
iter_enumerate           : 0.142778873444
iter_range               : 0.160353899002

所以:

  1. map(str.strip, my_list)是最快的方式,它只是比comperhensions快一点。
    • 如果您要应用一个功能(如str.split),请使用mapitertools.imap
    • 如果有更复杂的表达,请使用理解
  2. 手动迭代是最慢的方式;一个合理的解释是,它需要解释器做更多的工作,而高效的C运行时需要更少
  3. 继续并分配像my_list[:] = map...这样的结果,切片表示法只引入了一小部分开销,如果有多个对该列表的引用,可能会给你一些错误。
    • 了解改变列表并重新创建列表之间的区别。

答案 3 :(得分:3)

我认为你的意思是

a_list = [s.strip() for s in a_list]

使用生成器表达式可能是更好的方法,如下所示:

stripped_list = (s.strip() for s in a_list)

提供了延迟评估的好处,因此strip仅在需要剥离的给定元素时运行。

如果需要对列表的引用在当前作用域之外保持不变,则可能需要使用列表切片语法。:

a_list[:] = [s.strip() for s in a_list]

对于对各种方法的速度感兴趣的评论者来说,看起来在CPython中,生成器到切片的方法效率最低:

>>> from timeit import timeit as t
>>> t("""a[:]=(s.strip() for s in a)""", """a=[" %d " % s for s in range(10)]""")
4.35184121131897
>>> t("""a[:]=[s.strip() for s in a]""", """a=[" %d " % s for s in range(10)]""")
2.9129951000213623
>>> t("""a=[s.strip() for s in a]""", """a=[" %d " % s for s in range(10)]""")
2.47947096824646