现在我一直试图在字符串列表上执行strip(),我这样做了:
i = 0
for j in alist:
alist[i] = j.strip()
i+=1
有更好的方法吗?
答案 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)
有关性能的一些有趣的讨论发生在这里,所以让我提供一个基准:
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
所以:
map(str.strip, my_list)
是最快的方式,它只是比comperhensions快一点。
map
或itertools.imap
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