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

时间:2018-08-24 20:10:03

标签: python

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

我有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变长的情况下

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

2 个答案:

答案 0 :(得分:4)

您可以将map的单词添加到len并使用itertools.accumulate,尽管您必须在每个长度上添加1(用于空格)并添加首字母{ {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

答案 1 :(得分:1)

var line = MGLPolyline(coordinates:&coords, count:UInt(coords.count))