加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

使用大小列表拆分字符串的pythonic方法是什么?

发布时间:2020-12-20 12:33:53 所属栏目:Python 来源:网络整理
导读:实现这个的 pythonic方法是什么: s = "thisismystring"keys = [4,2,6]new = []i = 0for k in keys: new.append(s[i:i+k]) i = i+k 这确实给了我[‘this’,’is’,’my’,’string’],但是我觉得这是一种更优雅的方式.建议? 解决方法 您可以使用 itertools.
实现这个的 pythonic方法是什么:

s = "thisismystring"
keys = [4,2,6]
new = []
i = 0
for k in keys:
    new.append(s[i:i+k])
    i = i+k

这确实给了我[‘this’,’is’,’my’,’string’],但是我觉得这是一种更优雅的方式.建议?

解决方法

您可以使用 itertools.accumulate(),也许:

from itertools import accumulate

s = "thisismystring"
keys = [4,6]
new = []
start = 0
for end in accumulate(keys):
    new.append(s[start:end])
    start = end

您可以通过添加从零开始的另一个accumulate()调用来内联起始值:

for start,end in zip(accumulate([0] + keys),accumulate(keys)):
    new.append(s[start:end])

这个版本可以制成列表理解:

[s[a:b] for a,b in zip(accumulate([0] + keys),accumulate(keys))]

演示后者版本:

>>> from itertools import accumulate
>>> s = "thisismystring"
>>> keys = [4,6]
>>> [s[a:b] for a,accumulate(keys))]
['this','is','my','string']

双重累积可以用T恤()代替,包裹在pairwise() function from the itertools documentation中:

from itertools import accumulate,chain,tee

def pairwise(iterable):
    "s -> (s0,s1),(s1,s2),(s2,s3),..."
    a,b = tee(iterable)
    next(b,None)
    return zip(a,b)

[s[a:b] for a,b in pairwise(accumulate(chain([0],keys)))]

我在itertools.chain() call中输入前缀为0的起始位置,而不是创建一个带有连接的新列表对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读