Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在另一个给定列表中首次出现的列表中查找元素的索引?_Python_List_Numpy_Indexing_Set - Fatal编程技术网

Python 如何在另一个给定列表中首次出现的列表中查找元素的索引?

Python 如何在另一个给定列表中首次出现的列表中查找元素的索引?,python,list,numpy,indexing,set,Python,List,Numpy,Indexing,Set,答案应该是1。因为在a中,4首先出现在列表b中,它的索引是1 问题是python中是否有任何快速代码可以实现这一点 PS:实际上a是一个随机排列,b是a的子集,但它表示为一个列表。如果将b视为一个子集(顺序不重要,所有值都出现在a中),则使用min()和map(): 这将返回最低的索引。这是一个O(NK)解决方案(其中N是a的长度,K是b的长度),但所有循环都在C代码中执行 另一个选项是将a转换为集合,并在循环enumerate()上使用next(): 这是一个O(N)解决方案,但具有更高的固定

答案应该是1。因为在a中,4首先出现在列表b中,它的索引是1

问题是python中是否有任何快速代码可以实现这一点


PS:实际上a是一个随机排列,b是a的子集,但它表示为一个列表。

如果将
b
视为一个子集(顺序不重要,所有值都出现在
a
中),则使用
min()
map()

这将返回最低的索引。这是一个O(NK)解决方案(其中N是
a
的长度,K是
b
的长度),但所有循环都在C代码中执行

另一个选项是将
a
转换为集合,并在循环
enumerate()
上使用
next()

这是一个O(N)解决方案,但具有更高的固定成本(要执行的Python字节码)。这在很大程度上取决于
a
b
的大小,哪一个更快

对于问题中的小输入示例,
min(map(…)
wins:

bset = set(b)
next(i for i, v in enumerate(a) if v in bset)
一行:

In [86]: a = [3, 4, 2, 1, 7, 6, 5]
    ...: b = [4, 6]
    ...:

In [87]: %timeit min(map(a.index, b))
    ...:
608 ns ± 64.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [88]: bset = set(b)
    ...:

In [89]: %timeit next(i for i, v in enumerate(a) if v in bset)
    ...:
717 ns ± 30.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
输出:

print("".join([str(index) for item in b for index,item1 in enumerate(a) if item==item1][:1]))
详细内容:


对于小B样本,集合方法依赖于输出,执行时间随索引输出线性增长。在这种情况下,Numpy可以提供更好的解决方案

a = [3, 4, 2, 1, 7, 6, 5]
b = [4, 6]

new=[]
for item in b:
    for index,item1 in enumerate(a):
        if item==item1:
            new.append(index)

print("".join([str(x) for x in new[:1]]))

所以
b=[6,4]
的答案应该是一样的?你自己试过什么了吗?
b
总是一个子集吗,或者
b
中可能有不在
a
中的值吗?所以,你基本上想要
a.index(b[0])
?@cᴏʟᴅsᴘᴇᴇᴅ: 看看我的问题,我不这么认为。@Martijn Pieters是对的。这不会产生第一个索引。这仍然不会给出最低的索引。如果
a=[6,4]
你会得到错误的答案。为什么要切片并转换成字符串并连接呢?为什么不直接使用
[0]
?哪里错了,如果a=[6,4],那么它会给出答案
5
,这是第一个元素的索引,这是
6
,因为OP说他想要一个类似
1
的答案,所以我就加入它,;)它不应该,它应该产生
1
,因为这是第一个匹配索引。否则,您的代码将是一种非常昂贵的拼写方法。
a.index(b[0])
;如果你只想要第一个结果,为什么还要循环呢?
print("".join([str(index) for item in b for index,item1 in enumerate(a) if item==item1][:1]))
1
a = [3, 4, 2, 1, 7, 6, 5]
b = [4, 6]

new=[]
for item in b:
    for index,item1 in enumerate(a):
        if item==item1:
            new.append(index)

print("".join([str(x) for x in new[:1]]))
N=10**6
A=np.unique(np.random.randint(0,N,N))
np.random.shuffle(A)
B=A[:3].copy()
np.random.shuffle(A)

def find(A,B):
    pos=np.in1d(A,B).nonzero()[0]
    return pos[A[pos].argsort()][B.argsort().argsort()].min()


def findset(A,B):
    bset = set(B)
    return  next(i for i, v in enumerate(A) if v in bset)

#In [29]: find(A,B)==findset(A,B)
#Out[29]: True
#In [30]: %timeit findset(A,B)
# 63.5 ms ± 1.31 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 
# In [31]: %timeit find(A,B)
# 2.24 ms ± 52.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)