拆分一大串字符串并创建结果列表

时间:2018-11-15 20:28:12

标签: python performance

我有很多字符串。每个字符串都有许多由“;”分隔的段:

'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

有更快的方法吗?

3 个答案:

答案 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())