2016-07-06 183 views
1

我想要找到A中的第一个索引,其中包含的值为B。例如:找到列表A中的第一个索引,其中值在列表中B

A = [1, 'Q', 3, 6, 'R'] 
B = ['Z', 'I', 'O', 3] 
A.function(B) # would return 2 

有没有简单的方法来做到这一点?很明显,您可以通过A搜索B中的每个项目并获取最小索引,但这比每个索引尝试全部B要慢。

+0

它取决于哪个列表比较长,关于是否查找每个项目的索引并取最小值比一次在项目上搜索“B”并查看它是否在'A'中快。 – jonrsharpe

+0

总是找出每个项目的索引是O(A * B)。第二种方法是最坏情况下的O(A * B)和最好情况下的O(1)。 –

回答

4

我认为有两大类方法,这取决于列表较长:

  1. A长于B

    采取一个项目在A的时间和看它是否在B。重复,直到找到第一个。

    next(index for index, item in enumerate(A) if item in B) 
    

    这是更有效的,如果B转换为set(感谢@khelwood),但一定要做到这一点,你开始,而不是生成表达式中之前。

  2. B长于A

    查找在B每个项目的A索引,然后最小化:

    indices = [] 
    for item in B: 
        try: 
         indices.append(A.index(item)) 
        except ValueError: 
         pass 
    min(indices) 
    

    请注意,您不能使用:

    min(index for index in map(A.index, B) if index > -1) 
    

    (哎呀!),因为list doe没有一种方法可以在没有错误的情况下获得索引(参见例如list.index() function for Python that doesn't throw exception when nothing found)。

+0

@khelwood yep;编辑,谢谢 – jonrsharpe

0

做到这一点,最简单的方法是第一个列表中的每个元素迭代,并检查各是在第二个列表。

def firstInBoth(A, B): 
    for x in range(len(A)): 
     if A[x] in B: 
      return x 
相关问题