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']

然而,草堆和针都是日期列表。我需要为大海捞针的每个元素创建一个大海捞针索引列表,以便:
result = [5, 6, 7, nan, 5, 9]

我的问题和发布的示例之间的两大区别是:
一。我在针里有重复的东西(haystack没有任何重复的东西),这就意味着我不能使用set()
2。在极少数情况下,针中的元素可能不在大海捞针中,在这种情况下,我希望插入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)

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

最佳答案

如果数组非常大,那么可能需要制作一个字典来索引haystack:

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]

关于python - 查找一个列表中的任何元素出现在另一个列表中且重复的索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56589451/

10-14 17:56
查看更多