【问题标题】:Finding index of number from another list从另一个列表中查找数字索引
【发布时间】:2018-10-03 15:48:36
【问题描述】:

我使用的是 Python 3,我的代码中有两个列表:

ListA = [53, 1, 17, 4, 13, 2, 17]
ListB = [4, 3, 1]

现在,我想在 ListA 中的 ListB 中查找任意数字的索引。

这种情况下的输出应该是1,因为:

  • ListA 中的第一个值也是ListB 中的1
  • 1ListA 中的值索引是1

【问题讨论】:

  • 您可以将列表理解用作index = [ListB.index(j) for j in ListA if j in ListB][0]
  • 如果没有共同值怎么办?
  • 根据您的应用程序,np.in1d() 可能有用:docs.scipy.org/doc/numpy-1.15.0/reference/generated/…
  • 输出应该是ListAListB中公共值的索引吗?
  • 感谢大家的快速回复,我会澄清我的问题。我想在 ListA 中找到与 ListB 中的任何数字(4、3 或 1)匹配的索引。在我发布的示例中,数字 1 在 ListB 中,第一个在 ListA 中(来自 ListB 中的给定数字)。预期输出为:2 / 或者如果 ListA 没有来自 ListB 的任何数字,则输出将被扩展为 len(ListA)。希望我现在没有让你更加困惑????

标签: python python-3.x list indexing


【解决方案1】:

在纯 Python 中,您可以使用带有 nextenumerate 的生成器推导:

A = [53, 1, 17, 4, 13, 2, 17]
B = [4, 3, 1]
B_set = set(B)

first_lst = next(idx for idx, val in enumerate(A) if val in B_set)  # 1

请注意,我们通过 setB 中的值进行哈希处理以优化查找成本。复杂度为 O(m + n),其中 mnA 中的元素数,并且B 分别。要在未找到匹配项的情况下进行错误处理,您可以提供默认参数:

first_list = next((idx for idx, val in enumerate(A) if val in B_set), len(A))

如果您乐于使用第 3 方库,则可以使用 NumPy。如果不匹配,这里没有错误处理:

import numpy as np

A = np.array([53, 1, 17, 4, 13, 2, 17])
B = np.array([4, 3, 1])

first_np = np.where(np.in1d(A, B))[0][0]  # 1

【讨论】:

  • +1 表示 numpy。如果您已经使用数组,则非常方便,因此您不必将它们转换为集合或列表。也可以适配多维数组
  • 效果很好,非常感谢你的朋友! ?顺便说一句,我使用了你建议的第一个解决方案
【解决方案2】:

如果你想要更高的效率,你可以把ListB变成一个集合,这样你就可以确定一个项目是否在ListB中,平均时间复杂度为O(1):

setB = set(ListB)
print(next(i for i, a in enumerate(ListA) if a in setB))

这个输出:1

【讨论】:

    【解决方案3】:

    您可以使用以下生成器表达式:

    next(i for i, a in enumerate(ListA) for b in ListB if a == b)
    

    鉴于您的示例输入,这将返回:1

    【讨论】:

    • 很好,但是嵌套的for 循环使得复杂度为 O(m * n),对吧? [其中m, n = len(A), len(B)]。索引也应该参考A,而不是B
    • 你应该枚举 ListA 而不是 ListB
    • @jpp 是的,我写这个答案是为了快速给出答案。 ;-) 我刚刚单独发布了一个更有效的答案。如果你愿意,你可以检查一下。谢谢。
    【解决方案4】:

    设置交集以找到共同值。然后找到 ListA 中存在的所有索引,然后找到最小索引。如果没有匹配,它将打印 ListA 的长度

    set_inter =set(ListB).intersection(ListA)
    
    if set_inter: # if there is a common value
        idx_A=min([ListA.index(i) for i in set_inter])
        print(idx_A)
    else:
        print(len(ListA)) # print the length of ListA
    

    【讨论】:

      猜你喜欢
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      • 2016-05-21
      • 1970-01-01
      • 2023-03-13
      相关资源
      最近更新 更多