在Python中第一个','之前连接两个字符串并删除所有内容的最有效方法是什么?

时间:2010-11-06 03:15:27

标签: python algorithm concatenation

在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

这在我的代码中运行了数百万次,并且我已将其识别为瓶颈,所以我热衷于优化它以使其运行得更快。

执行此操作最有效(在运行时方面)?

6 个答案:

答案 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个要素。
在0个元素的情况下,它确实扩展了mystr来保存一个元素。

_,_,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

这是gnibbler's answer

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