在一个列表中查找任意元素在另一个列表中出现的索引,包括重复元素的索引。

3

我是一名新手,从MATLAB转到Python。我的问题与此帖子非常相似(在一个列表中查找任何元素出现在另一个列表中的索引),但有一些调整我无法完全整合(即处理重复项和缺失值)。

按照该示例,我有两个列表:haystack和needles:

haystack = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K']
needles = ['F', 'G', 'H', 'I', 'F', 'K']

然而,无论是“haystack”还是“needles”,都是日期列表。我需要在“haystack”中为每个“needles”的元素创建一个索引列表,使得:
result = [5, 6, 7, nan, 5, 9]

我的问题与发布的示例有两个主要不同之处: 1. 我的 needles 中有重复项(haystack 中没有任何重复项),据我所知这意味着我不能使用 set() 2. 很少情况下,needles 中的一个元素可能不存在于 haystack 中,在这种情况下,我希望插入 nan(或其他占位符)
到目前为止,我已经得到了这个代码(对于 haystack 和 needles 太大而不够高效):
import numpy as np

def find_idx(a,func):
    return [i for (i,val) in enumerate(a) if func(val)]

haystack = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K']
needles = ['F', 'G', 'H', 'I', 'F', 'K']

result=[]
for x in needles:
    try:
        idx = find_idx(haystack, lambda y: y==x)
        result.append(idx[0])
    except:
        result.append(np.nan)

据我所知,那段代码可以实现我的要求,但速度不够快。有更高效的替代方案吗?

这是一个重复的问题,与此标题下的这个问题相同。 - Onyambu
答案是简单的 [ haystack.index(x) if x in haystack else None for x in needles ] - Onyambu
2个回答

1
如果您的数组非常大,制作一个用于索引“干草堆”的字典可能是值得的:
haystack = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K']
needles  = ['F', 'G', 'H', 'I', 'F', 'K']

hayDict  = { K:i for i,K in enumerate(haystack) }
result   = [ hayDict.get(N,np.nan) for N in needles]

print(result)

# [5, 6, 7, nan, 5, 9]

谢谢!所有之前的回复都是正确的,但这个明显是最快的。感谢所有出色的回复! - Eric Johnson

0

这个怎么样?

results=[]
haystack = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K']
needles = ['F', 'G', 'H', 'I', 'F', 'K']    

for n in needles:
    if n in haystack:
        results.append(haystack.index(n))
    else:
        results.append("NaN")
print (results)

或者方法2:

haystack = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K']
needles = ['F', 'G', 'H', 'I', 'F', 'K']

results=[]

def getInd(n, haystack):
        if n in haystack:
                return haystack.index(n)
        else:
                return "NaN"

for n in needles:
        results.append(getInd(n, haystack))

print (results)

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