【问题标题】:Find the first index in a list A where the value is in a list B在列表 A 中查找值在列表 B 中的第一个索引
【发布时间】:2016-11-08 06:36:45
【问题描述】:

我想在A 中找到第一个包含B 值的索引。例如:

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

有没有一种简单的方法可以做到这一点?显然,您可以在A 中搜索B 中的每个项目并获取最小索引,但这比为每个索引尝试所有B 慢。

【问题讨论】:

  • 这取决于哪个列表更长,至于查找每个项目的索引并取最小值是否比一次在项目上搜索B并查看它是否在A中更快。
  • 查找每个项目的索引总是 O(AB)。第二种方法在最坏情况下是 O(AB),在最好情况下是 O(1)。

标签: python list python-2.7


【解决方案1】:

最简单的方法是遍历第一个列表的每个元素,并检查每个元素是否在第二个列表中。

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

【讨论】:

    【解决方案2】:

    我认为有两种广泛的方法,具体取决于哪个列表更长:

    1. AB

      一次在A 中取一项,看看它是否在B 中。重复直到找到第一个。

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

      如果将B 转换为set(感谢@khelwood),这会更有效,但请确保在开始之前这样做,而不是在生成器表达式中。 p>

    2. BA

      找到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 没有一种方法可以在没有错误的情况下获取索引(参见例如list.index() function for Python that doesn't throw exception when nothing found)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 2021-04-14
      • 2015-08-28
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多