找到一个列表中任何元素出现在另一个列表中的索引

时间:2015-04-05 00:03:43

标签: python arrays list indexing element

列出haystackneedles

列表
haystack = ['a', 'b', 'c', 'V', 'd', 'e', 'X', 'f', 'V', 'g', 'h']
needles = ['V', 'W', 'X', 'Y', 'Z']

我需要生成needleshaystack的任何元素出现的索引列表。在这种情况下,这些指数是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可能不包含针头,也可能包含许多针头。

5 个答案:

答案 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),也不会抛出任何错误。