Python 如何在另一个给定列表中首次出现的列表中查找元素的索引?
答案应该是1。因为在a中,4首先出现在列表b中,它的索引是1 问题是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)解决方案,但具有更高的固定
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)