给定一个字符串,我想创建一个包含字符串中所有 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 功能。