2

你好 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 循环迭代两个列表中每个元素的开始和结束位置。

你能帮我解决这个问题吗?

先感谢您。

4

5 回答 5

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. 请参阅:什么时候使用 zip 而不是 izip 更好?

于 2013-10-30T02:53:13.567 回答
2

您可以使用reduceandzip来执行此操作:

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

于 2013-10-30T02:53:36.820 回答
2
>>> ''.join(map(string.__getslice__, start_list, end_list))
'AAAACCCCEEEEGGGG'
于 2013-10-30T03:07:01.387 回答
0

使用List Comprehensionsstr.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

希望这可以帮助!

于 2013-10-30T02:57:00.990 回答
0

除了已经提供的答案之外,您还可以执行以下操作:

''.join(map(lambda a,b: string[a:b], start_list, end_list))
于 2013-10-30T03:04:08.173 回答