可以使用python字典理解来创建子字符串及其位置的字典吗?

 Andy 发布于 2023-02-12 20:51

给定一串字符,我想创建一个包含在字符串中的所有n字符子串的字典,其中字典键是子字符串,值是列表.列表的第一个元素是子字符串的出现次数,列表的第二个元素是这些出现的起始位置列表.

例如,使用n=3,字符串'abcdabcxdabc'会生成此字典:

{'abc': [3, [0, 4, 9]], 
 'cda': [1, [2]], 
 'dab': [2, [3, 8]], 
 'bcd': [1, [1]], 
 'cxd': [1, [6]], 
 'bcx': [1, [5]], 
 'xda': [1, [7]]}

下面的代码工作并且是有效的,因为它只遍历字符串一次,但我想知道是否有更优雅和/或更pythonic方式来执行此操作,可能使用字典理解.我对python很新,并且仍在试图弄清楚何时使用理解等有意义(甚至可能).

text = 'abcdabcxdabc'
n = 3
d = {}
for i in range(len(text) - n + 1):
    sub = text[i:i + n]
    if sub in d:
        d[sub][0] += 1
        d[sub][1].append(i)
    else:
        d[sub] = [1, [i]]
print(d)    

更新:感谢所有回复.他们通常证实我怀疑这太复杂了,无法在一次理解中有效地实施(但感谢火山表明如果效率不是一个问题就有可能实现).感谢RemcoGerlich和Ignacio Vazquez-Abrams将我指向defaultdict.我将不得不深入研究这一点.我的计时结果表明,与dict相比,初始化defaultdict会有更多的开销,但是运行时间可能稍微快一点,至少对于这个例子.(时间结果发布在下面单独的评论中.)现在我想知道是否有任何情况下dict优先于defaultdict.还有,感谢Narcolei指点我的timeit功能.

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