列出haystack
和needles
haystack = ['a', 'b', 'c', 'V', 'd', 'e', 'X', 'f', 'V', 'g', 'h']
needles = ['V', 'W', 'X', 'Y', 'Z']
我需要生成needles
中haystack
的任何元素出现的索引列表。在这种情况下,这些指数是3,6和8因此
result = [3, 6, 8]
This question I found非常相似,并且用
进行了相当优雅的解决result = [haystack.index(i) for i in needles]
不幸的是,这个解决方案在我的案例中给出了ValueError: 'W' is not in list
。这是因为这里的区别在于needles
的元素可能会多次出现在haystack
中或根本不出现。
换句话说,haystack
可能不包含针头,也可能包含许多针头。
答案 0 :(得分:14)
haystack = ['a', 'b', 'c', 'V', 'd', 'e', 'X', 'f', 'V', 'g', 'h']
needles = ['V', 'W', 'X', 'Y', 'Z']
st = set(needles)
print([i for i, e in enumerate(haystack) if e in st])
[3, 6, 8]
即使你使用了[haystack.index(i) for i in needles if i in haystack]
,它也会不,因为你有重复的元素。
制作st = set(needles)
意味着我们有一个线性解决方案,因为设置查找为0(1)
,对于大输入,效率会明显提高。
答案 1 :(得分:4)
needles_set = set(needles)
print [i for i, val in enumerate(haystack) if val in needles_set]
答案 2 :(得分:0)
除了你的针不在大海捞针中失败之外,索引方法将只返回你正在寻找的元素的第一个位置,即使该元素出现多次(如{{1}中所示)在你的例子中)。你可以这样做:
'V'
枚举函数生成一个生成值的元组 - 第一个是索引,第二个是值:
result = [idx for idx, val in enumerate(haystack) if val in needles]
只需检查每个值是否在针列表中,如果是,则添加索引。
答案 3 :(得分:0)
绝对不是最有效的方法,但你可以这样做:
result = []
i=0
while (i < len(haystack)):
if (needles.count(haystack[i]) > 0):
result.append(i)
i+=1
这将使得结果= [3,6,8]
答案 4 :(得分:0)
您可以尝试以下内容。
[Haystack.index(x) for x in needles if x in Haystack]
如果x不在haystack
中,则不会调用haystack.index(x)
,也不会抛出任何错误。