假设我有string
s = 'ABCDEFGHIJKLMNOP'
和排序list
integers
lst = [1, 4, 5, 9]
如何编写一个函数来相应地integers
和slice
string
?
必需的输出:
1)'A'[:1]
2) 'BCD' [1:4]
3) 'E' [4:5]
4) 'FGHI' [5:9]
5) 'JKLMNOP' [9:]
答案 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']