基于两个列表连接字符串的更有效方法

时间:2017-05-09 15:15:28

标签: python string list concatenation

想知道是否有更快的方法在两个字符串列表上生成字符串。例如,我有

e = ['1','2','3']
op = ['+','*']

我想得到"1+2*3"

假设我必须这样做一千次左右,使用不同大小的数组。有没有更快的方法来得到我想要的答案?

我尝试了几种方法,见下文。从我尝试的选项中,似乎使用+=更好。想知道是否有更快的方法。

编辑:(添加了一些建议)

import itertools

def usingPlus(e,sign):
    temp = ""
    for num, operator in zip(e, sign):
        temp += num
        temp += operator

    temp += e[-1]
    return temp

def joinArray(e, sign):
    temp = [ num+op for num, op in zip(e,sign) ]
    temp.append(e[-1])
    return "".join(temp)

def stringJoin(e, sign):
    temp = ""
    for num, operator in zip(e, sign):
        temp.join(num)
        temp.join(operator)

    temp.join(e[-1])
    return temp

def zip_longest(e, op):
    arry = [x+y for x,y in itertools.zip_longest(e,op,fillvalue="")]
    return "".join(arry)

def build_string(e,op):
    s=""
    for i in range(len(op)):
        s+=e[i]
        s+=op[i]
    s+=e[-1]
    return s

for i in range(3000000):
    e = ['1','2','3']
    op = ['+','*']

    usingPlus(e,op)               ## total ~2.7 sec
    #joinArray(e,op)              ## total ~3.4 sec
    #stringJoin(e,op)             ## total ~6.4 sec
    #zip_longest(e,op)            ## total ~4.1 sec
    #build_string(e,op)           ## total ~3.2 sec

2 个答案:

答案 0 :(得分:0)

使用给定的输入+ =似乎最快。
这个版本可以减少10%的时间。

import time
def build_string(e,op):
    s=""
    for i in range(len(op)):
        s+=e[i]
        s+=op[i]
    s+=e[-1]
e=['1','3','5','7']
op=['-','+','*']
start = time.time()
for x in range(3000000):
    build_string(e,op)
end = time.time()
print end-start

我没有包含return s,因为usingPlus

也没有
def build_string(e,op):
    s=""
    for idx,val in enumerate(op):
        s+=e[idx]
        s+=val
    s+=e[-1]

在我的盒子上刮掉更多的时间

答案 1 :(得分:0)

问候用户,

如果我可以贡献,在以下情况下:当输入是两个字符串列表时,每个元素都是长度为1的字符串。

下面的功能可能会给出一个想法。这很简单。

def parity_string(x,y):
z=x+y; z[0::2]=x; z[1::2]=y; z=str(z);
z=z[2::5];
return z

这个想法首先制作相应的列表版本,然后将其转换为字符串。最后一部分将分析最终字符串对象的模式。

如果输入类似于您的示例,则最终字符串中的所需字符将具有索引序列(2,7,12,...)。然后只取这些索引的值。

z=z[2::5];

希望这会有用。