按索引列表拆分字符串

Posted

技术标签:

【中文标题】按索引列表拆分字符串【英文标题】:Splitting a string by list of indices 【发布时间】:2012-06-06 18:19:37 【问题描述】:

我想通过索引列表拆分字符串,其中拆分段以一个索引开始并在下一个索引之前结束。

示例:

s = 'long string that I want to split up'
indices = [0,5,12,17]
parts = [s[index:] for index in indices]
for part in parts:
    print part

这将返回:

我要拆分的长字符串 我要拆分的字符串 我想分手 我想分手

我想得到:

长 字符串 那 我想分手

【问题讨论】:

【参考方案1】:
s = 'long string that I want to split up'
indices = [0,5,12,17]
parts = [s[i:j] for i,j in zip(indices, indices[1:]+[None])]

返回

['long ', 'string ', 'that ', 'I want to split up']

您可以使用以下方式打印:

print '\n'.join(parts)

另一种可能性(不复制indices)是:

s = 'long string that I want to split up'
indices = [0,5,12,17]
indices.append(None)
parts = [s[indices[i]:indices[i+1]] for i in xrange(len(indices)-1)]

【讨论】:

另一种方式是,[s[i:j] for i,j in izip_longest(indices,indices[1:])],但我更喜欢你的方式! 这会使用indices[1:] 复制索引列表,并通过zip 函数创建一个双倍大小的新列表 -> 性能不佳和内存消耗。 @ms4py 这很好,在这种情况下性能不是问题,这是一个非常易读的解决方案。如果性能是一个问题,可以使用我的建议。 eumiro-谢谢,这很好用。你能解释一下 +[None] 部分是如何工作的吗? @ms4py - 好的,有一个更新版本,没有复制列表,也没有 zip。尽管您的 itertools 版本可能性能更高。【参考方案2】:

这是一个使用大量itertools module 的简短解决方案。 tee 函数用于对索引进行成对迭代。如需更多帮助,请参阅模块中的配方部分。

>>> from itertools import tee, izip_longest
>>> s = 'long string that I want to split up'
>>> indices = [0,5,12,17]
>>> start, end = tee(indices)
>>> next(end)
0
>>> [s[i:j] for i,j in izip_longest(start, end)]
['long ', 'string ', 'that ', 'I want to split up']

编辑:这是一个不复制索引列表的版本,所以应该更快。

【讨论】:

感谢您的 alt 方法 - 有时必须查看 itertools 简洁的方法,学到了新的东西。有没有一种简单的方法可以消除表达式中前 3 个字符串末尾的多余空格?我尝试了s[i:j].strip(),但这根本不起作用(不知道为什么不) 如果你要使用它,你也可以直接使用 itertools 文档中的 pairwise 函数。同样使用next(end) 优于end.next() 以实现python 3 兼容性。【参考方案3】:

如果您不想对索引列表进行任何修改,您可以编写一个生成器:

>>> def split_by_idx(S, list_of_indices):
...     left, right = 0, list_of_indices[0]
...     yield S[left:right]
...     left = right
...     for right in list_of_indices[1:]:
...         yield S[left:right]
...         left = right
...     yield S[left:]
... 
>>> 
>>> 
>>> s = 'long string that I want to split up'
>>> indices = [5,12,17]
>>> [i for i in split_by_idx(s, indices)]
['long ', 'string ', 'that ', 'I want to split up']

【讨论】:

以上是关于按索引列表拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

Python:根据索引范围将列表拆分为子列表

在循环中按索引遍历列表列表,以重新格式化字符串

python中split的用法分割的字符串怎么命名?

如果我将从 db 获取的索引号存储在变量中并在按索引从列表中选择时使用,m 得到错误作为预期的字符串,int found-Robot Framework

按后缀排序列表

数据类型总结