Python 如何根据已排序整数列表对字符串进行切片?

Python 如何根据已排序整数列表对字符串进行切片?,python,Python,假设我有一个字符串 s='ABCDEFGHIJKLMNOP' 以及排序的整数的列表 lst=[1,4,5,9] 如何编写一个函数来相应地获取整数和切片字符串 所需输出: 1)'A'[:1] 2) 'BCD' [1:4] 3) 'E' [4:5] 4) 'FGHI' [5:9] 5) 'JKLMNOP' [9:] 您可以使用索引构造显式对象,然后使用这些切片为字符串编制索引 从那时起,它就归结为通常的“如何从序列中获取成对对象”,Python并没有真正的内置解决方案 这是一个略显邪恶、简

假设我有一个
字符串

s='ABCDEFGHIJKLMNOP'

以及排序的
整数的
列表

lst=[1,4,5,9]

如何编写一个函数来相应地获取
整数
切片
字符串

所需输出:

1)'A'[:1]

2) 'BCD' [1:4]

3) 'E' [4:5]

4) 'FGHI' [5:9]

5) 'JKLMNOP' [9:]

您可以使用索引构造显式对象,然后使用这些切片为字符串编制索引

从那时起,它就归结为通常的“如何从序列中获取成对对象”,Python并没有真正的内置解决方案

这是一个略显邪恶、简洁的解决方案,它利用了可以在锁定步骤中迭代多个序列的事实:

s = 'ABCDEFGHIJKLMNOP'
idx = [1, 4, 5, 9]
parts = [s[slc] for slc in map(slice, [0] + idx, idx + [None])]
如果有很多索引,就不要这样做,因为它会动态地为索引构造两个中间列表

显然,如果一个人可以事先按摩idx,也可以

from itertools import imap
s = 'ABCDEFGHIJKLMNOP'
idx = [0, 1, 4, 5, 9, None]
parts = [s[slc] for slc in imap(slice, idx[:-1], idx[1:])]

我的解决方案不是最优雅的,但它非常简单,而且扩展性很好

查看for list slicing语法,所有列表切片的形式都是
list[start:end]
。忽略
start
将为其提供值0,忽略
end
将为其提供值
len(list)

因此,如果将0和
len(list)
添加到索引中,则解决问题变得非常简单,有效地删除了规范中最棘手的部分,即第一个和最后一个索引:

numbers = [1, 4, 5, 9]
string = 'ABCDEFGHIJKLMNOP'

numbers.append(len(string))
numbers.insert(0,0)

result = [string[numbers[i]:numbers[i+1]] for i in range(len(numbers)-1)]
输出:

>>> print(result)
['A', 'BCD', 'E', 'FGHI', 'JKLMNOP']

或者,
[s[a:b]表示zip中的a,b([0]+idx,idx+[None])]
@tobias_k。。。当然,使用
itertools.imap()
itertools.izip()
)再次避免Python2中的中间列表。