如何根据排序整数列表切片?

时间:2017-07-08 16:37:01

标签: python

假设我有string

s = 'ABCDEFGHIJKLMNOP'

和排序list

integers

lst = [1, 4, 5, 9]

如何编写一个函数来相应地integersslice string

必需的输出:

1)'A'[:1]

2) 'BCD' [1:4]

3) 'E' [4:5]

4) 'FGHI' [5:9]

5) 'JKLMNOP' [9:]

2 个答案:

答案 0 :(得分:5)

您可以使用索引构造显式slice()对象,然后使用这些切片索引字符串。

从那时起,它归结为通常的“如何从序列中获得配对对象”,而Python实际上并没有内置的解决方案。

一个有点邪恶,紧凑的解决方案,利用map()可以在锁定步骤中迭代多个序列的事实:

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:])]

答案 1 :(得分:2)

我的解决方案不是最优雅的,但它非常简单,并且可以很好地扩展。

查看documentation列表切片语法,所有列表切片的格式为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']