我有很多字符串。每个字符串都有许多由“;”分隔的段:
'1,2,23,17,-1006,0.20;1,3,3,2258,-1308,0.72;'
我想用“;”分割每个字符串并保存结果列表。
我当前正在使用:
player_parts = []
for line in playerinf:
parts = line.split(";")
player_parts = player_parts + parts
有更快的方法吗?
答案 0 :(得分:2)
如果我对您的理解正确,则可以尝试itertools.chain
并解开列表理解:
from itertools import chain
lines = ['1,2,23,17,-1006,0.20;1,3,3,2258,-1308,0.72;', '2,3,34,56,-2134,0.50;2,4,7,2125,-3408,0.56;']
parts = list(chain(*[line.split(';')[:-1] for line in lines]))
parts
# ['1,2,23,17,-1006,0.20',
# '1,3,3,2258,-1308,0.72',
# '2,3,34,56,-2134,0.50',
# '2,4,7,2125,-3408,0.56']
我添加了一个[:-1]
以删除split(';')
的最后一个空元素。但是,如果您需要该空元素,只需删除[:-1]
。
由于chain
在编译后的代码上运行,因此它应该比python解释器快得多。
10000行的运行时间是:
using chain: 0.34399986267089844s
using your method: > 240.234s # (I didn't want to wait any more)
答案 1 :(得分:2)
据我所知,如果速度很重要,列表理解总是一个很好的方法。
player_parts = [line.split(';') for line in playerinf]
答案 2 :(得分:2)
每次执行player_parts = player_parts + parts
时,您都是将两个列表合并为一个新列表,并将该列表分配给player_parts
。那是非常低效的。进行player_parts.extend(parts)
可以大大提高性能,因为它将内容添加到了原始player_parts
列表的末尾。
但是,看来您可能正在向player_parts
列表中添加一些空字符串。因此,让我们看看是否有更好的方法。
听起来您有一个这样的文件:
1,2,23,17,-1006,0.20;1,3,3,2258,-1308,0.72;
1,2,23,17,-1006,0.20;1,3,3,2258,-1308,0.72
1,2,23,17,-1006,0.20;1,3,3,2258,-1308,0.72;
您想要这个结果:
['1,2,23,17,-1006,0.20', '1,3,3,2258,-1308,0.72', '1,2,23,17,-1006,0.20',
'1,3,3,2258,-1308,0.72', '1,2,23,17,-1006,0.20', '1,3,3,2258,-1308,0.72']
所以这应该起作用:
f = open('infile', 'r')
player_parts = []
for line in f: # For each line in the file
for segment in line.split(';'): # For each segment in the line
if segment.strip(): # If the segment has anything in it besides whitespace
player_parts.append(segment) # Add it to the end of the list
如果您对理解感到满意,可以执行以下操作:
f = open('infile', 'r')
player_parts = []
for line in f:
player_parts.extend(segment for segment in line.split(';') if segment.strip())