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

cha*_*bln 9 python arrays indexing element list

列表haystackneedles

haystack = ['a', 'b', 'c', 'V', 'd', 'e', 'X', 'f', 'V', 'g', 'h']
needles = ['V', 'W', 'X', 'Y', 'Z']
Run Code Online (Sandbox Code Playgroud)

我需要让其产生的任何元素的索引列表needles中出现haystack.在这种情况下,那些指数因此是3,6和8

result = [3, 6, 8]
Run Code Online (Sandbox Code Playgroud)

我发现这个问题非常相似,并且相当优雅地解决了

result = [haystack.index(i) for i in needles]
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个解决方案ValueError: 'W' is not in list在我的情况下.这是因为这里的不同之处在于元素needles可能haystack多次出现或者根本不出现.

换句话说,haystack可能不包含任何针或它可能包含许多针.

Pad*_*ham 15

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]
Run Code Online (Sandbox Code Playgroud)

即使你使用[haystack.index(i) for i in needles if i in haystack]它也不会有效,因为你有重复的元素.

制作st = set(needles)意味着我们有一个线性解决方案,因为集合查找0(1)对于大输入来说效率要高得多.

  • 将“针”放在一组中绝对是更好的解决方案。哈希表查找肯定会提高性能。 (2认同)

pai*_*ima 0

如果您的针不在大海捞针中,除了会失败之外,索引方法还将仅返回您正在查找的元素的第一个位置,即使该元素出现多次(如'V'您的示例中所示)。你可以这样做:

result = [idx for idx, val in enumerate(haystack) if val in needles]
Run Code Online (Sandbox Code Playgroud)

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

>>> print(list(enumerate(['a', 'b', 'c'])))
Run Code Online (Sandbox Code Playgroud)

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