gpt4 book ai didi

python - 尝试找到一种巧妙的方法来查找给定字符串中关键字的索引

转载 作者:行者123 更新时间:2023-11-28 21:35:40 24 4
gpt4 key购买 nike

我知道有很多关于在字符串中查找给定关键字的索引的主题,但我的情况有点不同

我有 2 个输入,一个是字符串,另一个是映射列表(或者任何你想称呼的名称)

s = "I am awesome and I love you"
mapping_list = "1 1 2 3 1 2 3"

每个单词总是映射到映射列表中的一个数字。现在我想在匹配字符串时找到给定数字的所有索引,例如 1。

在上述情况下,它将返回 [0, 2, 17] (Thakns @rahlf23)

我目前的方法是用数字压缩每个单词

zip(mapping_list.split(' '), s.split(' '))

这给了我

('1', 'I')
('1', 'am')
('2', 'awesome')
('3', 'and')
('1', 'I')
('2', 'love')
('3', 'you')

然后遍历列表,找到“1”,使用该单词生成正则表达式,然后搜索索引并将其附加到列表或其他内容中。冲洗并重复。

然而,这似乎效率很低,特别是如果 s 变得非常长

我想知道是否有更好的方法来处理它。

最佳答案

您可以将单词映射到其len并使用itertools.accumulate ,尽管您必须为每个长度添加 1(对于空格),并为第一个单词的开头添加初始 0

>>> words = "I am awesome and I love you".split()
>>> mapping = list(map(int, "1 1 2 3 1 2 3".split()))
>>> start_indices = list(itertools.accumulate([0] + [len(w)+1 for w in words]))
>>> start_indices
[0, 2, 5, 13, 17, 19, 24, 28]

最后一个元素未被使用。然后,zip 并迭代这些对并将它们收集到字典中。

>>> d = collections.defaultdict(list)
>>> for x, y in zip(mapping, start_indices):
... d[x].append(y)
>>> dict(d)
>>> {1: [0, 2, 17], 2: [5, 19], 3: [13, 24]}

或者,您也可以使用 regular expression\b\w (单词边界后跟单词字符)一样找到单词开始的每个位置,然后按照上面的步骤进行。

>>> s = "I am awesome and I love you"
>>> [m.start() for m in re.finditer(r"\b\w", s)]
[0, 2, 5, 13, 17, 19, 24]

关于python - 尝试找到一种巧妙的方法来查找给定字符串中关键字的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52011112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com