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

时间:2017-10-21 10:05:31

标签: python list numpy indexing set

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

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

问题是python中有没有快速代码来实现这个目标?

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

3 个答案:

答案 0 :(得分:3)

如果要将<layout> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" tools:context="com.app.android.login.LoginActivity" tools:ignore="missingPrefix"> <android.support.constraint.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="@dimen/default_view_margin_bottom_8dp"> <android.support.design.widget.TextInputLayout android:id="@+id/til_login_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/default_view_margin_right_8dp" android:layout_marginStart="@dimen/default_view_margin_left_8dp" android:textColorHint="@color/colorSecondaryText" app:hintTextAppearance="@style/AppTheme.InputLayoutStyle" app:layout_constraintBottom_toTopOf="@+id/til_login_password" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_chainStyle="packed"> <android.support.design.widget.TextInputEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/login_email" android:imeOptions="actionNext" android:singleLine="true" android:textColor="@color/colorPrimaryText" /> </android.support.design.widget.TextInputLayout> <android.support.design.widget.TextInputLayout android:id="@+id/til_login_password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/default_view_margin_right_8dp" android:layout_marginStart="@dimen/default_view_margin_left_8dp" android:textColorHint="@color/colorSecondaryText" app:hintTextAppearance="@style/AppTheme.InputLayoutStyle" app:layout_constraintBottom_toTopOf="@+id/btn_login_login" app:layout_constraintTop_toBottomOf="@+id/til_login_email" app:layout_constraintVertical_chainStyle="packed"> <android.support.design.widget.TextInputEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/login_password" android:imeOptions="actionDone" android:singleLine="true" android:textColor="@color/colorPrimaryText" /> </android.support.design.widget.TextInputLayout> <Button android:id="@+id/btn_login_login" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/default_view_margin_right_8dp" android:layout_marginStart="@dimen/default_view_margin_left_8dp" android:layout_marginTop="48dp" android:text="@string/login_btn_text" android:textColor="@color/colorWhite" app:layout_constraintBottom_toTopOf="@+id/textview_login_forgot_password" app:layout_constraintTop_toBottomOf="@+id/til_login_password" app:layout_constraintVertical_chainStyle="packed" /> <TextView android:id="@+id/textview_login_forgot_password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/default_view_margin_right_8dp" android:layout_marginStart="@dimen/default_view_margin_left_8dp" android:layout_marginTop="36dp" android:gravity="center" android:text="@string/login_forgot_password" app:layout_constraintBottom_toTopOf="@+id/btn_login_register" app:layout_constraintTop_toBottomOf="@+id/btn_login_login" app:layout_constraintVertical_chainStyle="packed" /> <Button android:id="@+id/btn_login_register" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/default_view_margin_right_8dp" android:layout_marginStart="@dimen/default_view_margin_left_8dp" android:text="@string/login_sign_up" android:textColor="@color/colorWhite" app:layout_constraintBottom_toBottomOf="parent" /> </android.support.constraint.ConstraintLayout> </ScrollView> </layout> 视为子集(顺序无关紧要,b中存在所有值),请将amin()一起使用:

map()

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

另一种选择是将b转换为一个集合,并在a上的循环上使用next()

enumerate()

这是一个O(N)解决方案,但具有更高的常量成本(要执行的Python字节码)。它在很大程度上取决于bset = set(b) next(i for i, v in enumerate(a) if v in bset) a的大小,其中一个会更快。

对于问题中的小输入示例,b获胜:

min(map(...))

答案 1 :(得分: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]]))

答案 2 :(得分:0)

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

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)