【问题标题】:Print indices of matching list elements打印匹配列表元素的索引
【发布时间】:2020-09-07 14:55:39
【问题描述】:

我不明白为什么要打印[0, 2, 3, 3]。我需要打印lst1 中每个元素的索引,它等于lst2 中的相应元素。所以我应该得到[0, 2, 3]。我对 python 还很陌生,所以我不能掌握 for 循环遍历列表或其他东西的顺序。

def same_values(lst1, lst2):
  final = []
  for num in lst1:
    if lst2[lst1.index(num)] == num:
      final.append(lst1.index(num))
  return final
print(same_values([5, 1, -10, 3, 3], [5, 10, -10, 3, 5]))

【问题讨论】:

  • 提示:lst1.index(3) 是什么?

标签: python python-3.x for-loop


【解决方案1】:

发生错误是因为一旦元素索引 3 和 4 相等,代码 lst1.index(num) 就会两次返回值 3。

使用不同的方法更安全:

def same_values(lst1, lst2):
    final = []
    for i in range(len(lst1)):
        if lst1[i] == lst2[i]:
            final.append(i)
    return final
print(same_values([5, 1, -10, 3, 3], [5, 10, -10, 3, 5]))

输出:

[0, 2, 3]

【讨论】:

    【解决方案2】:

    lst1.index(3) 将返回3 两次,因为这是lst13第一次出现

    相反,您可以使用zip 并行迭代列表,并使用enumerate 访问索引。

    def same_values(lst1, lst2):
        final = []
        for i, (v1, v2) in enumerate(zip(lst1, lst2)):
            if v1 == v2:
                final.append(i)
        return final
    
    print(same_values([5, 1, -10, 3, 3], [5, 10, -10, 3, 5]))  # -> [0, 2, 3]
    

    这里for i, (v1, v2) in ... 位使用嵌套的可迭代解包。

    另外,您可以将其简化为 comprehension,尽管它有点吵:

    def same_values(lst1, lst2):
        return [i for i, (v1, v2) in enumerate(zip(lst1, lst2)) if v1 == v2]
    

    【讨论】:

      【解决方案3】:

      5, -10, 3, 3 正在匹配,因为您每次都在扫描整个第二个列表

      注意:你可以使用枚举获取索引和元素

      for i, num in enumerate(lst1):
      

      如果您想比较“对应的索引”,请访问两个列表并进行比较,而不是使用index(num)“查找匹配元素的索引”

      还可以查看zip() 函数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-19
        • 1970-01-01
        • 2019-05-14
        相关资源
        最近更新 更多