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

18

使用列表haystackneedles

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]

我找到的这个问题非常相似,而且已经被优雅地解决了。

result = [haystack.index(i) for i in needles]

很遗憾,这个解决方案在我的情况下会出现ValueError: 'W' is not in list。原因是这里的区别在于needles的一个元素可能会在haystack中出现多次或者根本没有出现。

换句话说,haystack中可能没有针,也可能有很多针。

5个回答

23
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),这对于大规模输入来说会更加高效。


2
needles 放入一个集合中绝对是更好的解决方案。哈希表查找绝对可以提高性能。 - Anzel
@Anzel,显然这里不会有太大的差别,但在大型数据集上会有显著的影响。 - Padraic Cunningham

4
needles_set = set(needles)
print [i for i, val in enumerate(haystack) if val in needles_set]

如何找到在 haystack 中未找到 needles_set 的索引? - thepunitsingh

1
您可以尝试以下内容:

您可以尝试以下内容。

[Haystack.index(x) for x in needles if x in Haystack]

如果 x 不在“haystack”中,则不会调用“haystack.index(x)”并且不应抛出任何错误。

1
无法正常工作,因为您始终会获得任何重复元素的第一个索引。 - Padraic Cunningham

0
除了在干草堆中找不到针时失败外,索引方法还将仅返回您要查找的元素的第一个位置,即使该元素出现多次(例如您示例中的'V')。您可以这样做:
result = [idx for idx, val in enumerate(haystack) if val in needles]

enumerate函数生成一个生成器,该生成器产生值的元组 - 第一个是索引,第二个是值:

>>> print(list(enumerate(['a', 'b', 'c'])))

只需检查每个值是否在您的 needles 列表中,如果是,则添加索引。


0

这绝对不是最有效的方法,但你可以像这样做:

result = []
i=0
while (i < len(haystack)):
    if (needles.count(haystack[i]) > 0):
        result.append(i)
    i+=1

这将使结果 = [3, 6, 8]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接