在Python中,有没有办法通过记录每个字符的位置来索引文本(作为字符串?)?



是否可以提取一段长文本,如故事、小说或新闻文章,并为文本中的每个字符"索引"?

例如,让我们用下面的句子:

酸性云层在城市上空缓慢移动,笼罩着一层雾,开始窒息居民的生活。

在上面的句子中,第一个(或零)字符是t,第二个和第三个字符是h和e。随着文本的继续,将有几十个甚至数百个t、h、e的实例,以及字母表中的其他字母,以及标点符号等。

是否可以创建这些的索引,例如,其中将存在一个字符串来索引e的所有实例?也许它看起来像3、17、23、29、33、45、51、59、123、4334等。在整个文本被索引(并通过字符"分割")后,这些索引将可以通过搜索访问,因此可以引用数字(字符位置),并在必要时将其转换回字符。这可能吗?如果以上任何一项都不清楚,我很抱歉。

当然。

def get_indices(text):
if text is None:
return None
indices = {}
for i in range(len(text)):
char = text[i]
try:
indices[char].append(i)
except KeyError:
indices[char] = [i]
return indices

或者(按照建议):

import collections
def get_indices_2(text):
if text is None:
return None
indices = collections.defaultdict(list)
for i, char in enumerate(text):
indices[char].append(i)
return indices

这应该适用于将字符映射到位置。

您可以使用这样的东西:

s = 'The acidic clouds slowly moved over the city, blanketing it with a fog that began to choke the life from its residents.'
letter_indices = {}
for i, let in enumerate(s):
letter_indices.setdefault(let, []).append(i)

此外,正如评论中所建议的,您可以使用defaultdict(它比以前更好):

from collections import defaultdict
letter_indices = defaultdict(list)
for i, let in enumerate(s):
letter_indices[let].append(i)

最新更新