Python大师们好!
正如标题所说,我必须将子字符串与两个开始和结束位置列表中提供的信息相连接。
例如,
string = 'AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJKKKK'
start_list = [0,8,16,24]
end_list = [4,12,20,28]
最终结果应该是
print (string[0:4]+string[8:12]+string[16:20]+string[24:28])
AAAACCCCEEEEGGGG
如果开始和结束位置增加,我必须使用for循环 迭代两个列表中每个元素的开始和结束位置。
你能帮助我解决这个问题吗?
提前谢谢。
答案 0 :(得分:3)
您可以使用zip
:
''.join(string[a:b] for a, b in zip(start_list, end_list))
zip
结合了多个迭代器:
print zip(start_list, end_list)
> [(0, 4), (8, 12), (16, 20), (24, 28)]
如果索引列表很长,您可能希望使用izip
。请参阅:When is it better to use zip instead of izip?
答案 1 :(得分:2)
您可以使用reduce
和zip
执行此操作:
In [1]: timeit reduce(lambda s, (i, j): s + string[i:j], zip(start_list, end_list), '')
100000 loops, best of 3: 2.67 μs per loop
这会迭代每个(start, stop)
索引对,并将这些索引给出的string
子字符串连接在一起。
同样,您可以使用列表推导或生成器join
:
In [3]: # generator
In [4]: timeit ''.join( string[i:j] for i, j in zip(start_list, end_list) )
100000 loops, best of 3: 3.43 μs per loop
In [5]: # list comprehension
In [6]: timeit ''.join([ string[i:j] for i, j in zip(start_list, end_list) ])
100000 loops, best of 3: 1.86 μs per loop
最后,您可以使用@ gnibbler使用字符串切片的答案:
In [7]: #slicing
In [8]: timeit ''.join(map(string.__getslice__, start_list, end_list))
100000 loops, best of 3: 1.82 μs per loop
使用timeit
,最快的方式似乎是使用列表切片和join
,然后是join
和列表推导,然后是reduce
。
答案 2 :(得分:2)
>>> ''.join(map(string.__getslice__, start_list, end_list))
'AAAACCCCEEEEGGGG'
答案 3 :(得分:0)
使用List Comprehensions和str.join
,您可以轻松实现此目标:
''.join([string[v:end_list[i]] for i, v in enumerate(start_list)])
或者,您可以使用内置的zip()
功能:
''.join([string[start:end] for start, end in zip(start_list, end_list)])
演示 - 列表理解:
>>> a =''.join([string[v:end_list[i]] for i, v in enumerate(start_list)])
>>> print(a)
AAAACCCCEEEEGGGG
使用zip()
:
>>> a = ''.join([string[start:end] for start, end in zip(start_list, end_list)])
>>> print(a)
AAAACCCCEEEEGGGG
希望这有帮助!
答案 4 :(得分:0)
除了已提供的答案外,您还可以:
''.join(map(lambda a,b: string[a:b], start_list, end_list))