查找一个列表中的任何元素出现在另一个列表中的索引,其中包含重复项

2024-06-09 08:40:05 发布

您现在位置:Python中文网/ 问答频道 /正文

Python新手,来自MATLAB。我的问题与这篇文章(Find the indices at which any element of one list occurs in another)非常相似,但有一些我无法完全融入的调整(即管理重复和丢失的值)。在

在这个例子之后,我有两个列表,草堆和针:

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

然而,干草堆和针都是日期列表。我需要为haystack中针的每个元素创建一个索引列表,以便:

^{pr2}$

我的问题和发布的示例之间的两大区别是: 1我有重复的针(干草堆没有任何重复),这是我可以说的,这意味着我不能使用set() 2在极少数情况下,针中的元素可能不在haystack中,在这种情况下,我想插入一个nan(或其他占位符)

到目前为止,我得到了这个(对于草堆和针头有多大还不够有效):

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)

据我所知,这段代码可以满足我的需要,但速度不够快。更有效的替代品?在


Tags: in元素列表fornp情况resultnan
2条回答

如果您的数组非常大,可能值得编写一个字典来索引干草堆:

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]

这个怎么样?在

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:

^{pr2}$

相关问题 更多 >