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中的中间列表。