在任意索引处有效地分区字符串

 林韵杰64833 发布于 2023-02-09 08:14

给定一个任意字符串(即,不基于模式),请说:

>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

我试图基于索引列表分区字符串.

这是我尝试过的,它确实有效:

import string

def split_at_idx(txt, idx):
    new_li=[None]*2*len(idx)
    new_li[0::2]=idx
    new_li[1::2]=[e for e in idx]
    new_li=[0]+new_li+[len(txt)]
    new_li=[new_li[i:i+2] for i in range(0,len(new_li),2)]  
    print(new_li)
    return [txt[st:end] for st, end in new_li]

print(split_at_idx(string.ascii_letters, [3,10,12,40]))  
# ['abc', 'defghij', 'kl', 'mnopqrstuvwxyzABCDEFGHIJKLMN', 'OPQRSTUVWXYZ']

拆分基于索引列表[3,10,12,40].然后需要将此列表转换为开始,结束对的列表[[0, 3], [3, 10], [10, 12], [12, 40], [40, 52]].我使用切片分配来设置平均值和赔率,然后将列表理解分组成对,并使用第二个LC来返回分区.

对于这样一个简单的函数来说,这似乎有点复杂.有没有更好/更有效/更惯用的方式来做到这一点?

1 个回答
  • 我有一种感觉,最近有人问过这个问题,但我现在找不到了.假设丢弃的信件是意外,你不能这样做:

    def split_at_idx(s, idx):
        return [s[i:j] for i,j in zip([0]+idx, idx+[None])]
    

    之后我们有了

    >>> split_at_idx(string.ascii_letters, [3, 10, 12, 40])
    ['abc', 'defghij', 'kl', 'mnopqrstuvwxyzABCDEFGHIJKLMN', 'OPQRSTUVWXYZ']
    >>> split_at_idx(string.ascii_letters, [])
    ['abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ']
    >>> split_at_idx(string.ascii_letters, [13, 26, 39])
    ['abcdefghijklm', 'nopqrstuvwxyz', 'ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ']
    

    2023-02-09 08:17 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有