在Python中,我有一个字符串,它是逗号分隔的值列表。例如'5,2,7,8,3,4'
我需要在结尾添加一个新值并删除第一个值
e.g。 '5,22,7,814,3,4' - > '22,7,814,3,4,1'
目前,我这样做:
mystr = '5,22,7,814,3,4'
latestValue='1'
mylist = mystr.split(',')
mystr = ''
for i in range(len(mylist)-1):
if i==0:
mystr += mylist[i+1]
if i>0:
mystr += ','+mylist[i+1]
mystr += ','+latestValue
这在我的代码中运行了数百万次,并且我已将其识别为瓶颈,所以我热衷于优化它以使其运行得更快。
执行此操作最有效(在运行时方面)?
答案 0 :(得分:9)
使用此:
if mystr == '':
mystr = latestValue
else:
mystr = mystr[mystr.find(",")+1:] + "," + latestValue
这应该比分割列表的任何解决方案快得多。它只找到第一次出现,
并“删除”字符串的开头。此外,如果列表为空,那么mystr
将只是latestValue
(由此添加的微不足道的开销) - 感谢Paulo Scardine指出这一点。
答案 1 :(得分:6)
mystr = mystr.partition(",")[2]+","+latestValue
如果mystr有< Paulo建议改进的话。 2个要素。_,_,mystr = (mystr+','+latestValue).partition(',')
$ python -m timeit -s "mystr = '5,22,7,814,3,4';latestValue='1'" "mystr[mystr.find(',')+1:]+','+latestValue"
1000000 loops, best of 3: 0.847 usec per loop
$ python -m timeit -s "mystr = '5,22,7,814,3,4';latestValue='1'" "mystr = mystr.partition(',')[2]+','+latestValue"
1000000 loops, best of 3: 0.703 usec per loop
答案 2 :(得分:6)
_, sep, rest = mystr.partition(",")
mystr = rest + sep + latestValue
如果mystr
为空或单个项目(后面没有逗号), 也无需任何更改,因str.partition
返回空sep
sep
中没有mystr
。
如果mystr.rstrip(",")
中可能有一个尾随逗号,则可以在调用partition()
之前使用mystr
。
答案 3 :(得分:4)
最佳版本:gnibbler's answer
因为你需要速度(数百万次很多),我描述了。这个速度大约是拆分列表的两倍:
i = 0
while 1:
if mystr[i] == ',': break
i += 1
mystr = mystr[i+1:] + ', ' + latest_value
假设每个逗号后面有一个空格。如果这是一个问题,您可以使用:
i = 0
while 1:
if mystr[i] == ',': break
i += 1
mystr = mystr[i+1:].strip() + ', ' + latest_value
只比原来稍微慢一些但更强大。这取决于你需要多少速度来挤出它。他们都假设字符串中会有一个逗号,如果没有出现,会引发IndexError
。安全版本是:
i = 0
while 1:
try:
if mystr[i] == ',': break
except IndexError:
i = -1
break
i += 1
mystr = mystr[i+1:].strip() + ', ' + latest_value
同样,这仍然比分割字符串快得多,但确实以速度为代价增加了稳健性。
这是时间结果。您可以看到第四种方法明显快于第三种(最强大)方法,但比前两种方法稍慢。这是两个强大的解决方案中最快的,尽管如此,除非你确定你的字符串中会有逗号(如果它们没有它就已经被认为是错误),那么无论如何我都会使用它。
$ python -mtimeit -s'from strings import tests,method1''method1(tests [0],“10”)' 1000000循环,最佳3:1.34每循环使用
$ python -mtimeit -s'from strings import tests,method2''method2(tests [0],“10”)' 1000000循环,最佳3:1.34每循环使用
$ python -mtimeit -s'from strings import tests,method3''method3(tests [0],“10”)' 1000000循环,最佳3:1.5每循环usec
$ python -mtimeit -s'from strings import tests,method4''method4(tests [0],“10”)' 1000000循环,最佳3:1.38每循环使用
$ python -mtimeit -s'from strings import tests,method5''method5(tests [0],“10”)' 100000循环,最佳3:每循环使用1.18
答案 4 :(得分:2)
mylist = mystr.split(',')
mylist.append(latestValue);
mystr = ",".join(mylist[1:])
python中的字符串连接效率不高(因为字符串是不可变的)。使用它们作为列表更容易(并且更有效)。基本上在您的代码中,每次连接时都会反复复制字符串。
答案 5 :(得分:2)
编辑: 不是最好的,但我喜欢单行。 : - )
mystr = ','.join(mystr.split(',')[1:]+[latestValue])
在测试之前我会打赌它会表现得更好。
> python -m timeit "mystr = '5,22,7,814,3,4'" "latestValue='1'" \
"mylist = mystr.split(',')" "mylist.append(latestValue);" \
"mystr = ','.join(mylist[1:])"
1000000 loops, best of 3: 1.37 usec per loop
> python -m timeit "mystr = '5,22,7,814,3,4'" "latestValue='1'"\
"','.join(mystr.split(',')[1:]+[latestValue])"
1000000 loops, best of 3: 1.5 usec per loop
> python -m timeit "mystr = '5,22,7,814,3,4'" "latestValue='1'"\
'mystr=mystr[mystr.find(",")+1:]+","+latestValue'
1000000 loops, best of 3: 0.625 usec per loop