我知道有很多关于查找字符串中给定关键字的索引的主题,但是我的情况有些不同
我有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
变长的情况下
我想知道是否有更好的方法来处理它。
答案 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))