当前位置: 首页 > 知识库问答 >
问题:

Python:防止双for循环返回相同的列表索引

上官鸿朗
2023-03-14

我目前正在Leetcode中处理问题1,名为“两个和”

给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标。

您可以假设每个输入都有一个精确的解决方案,并且您可以不使用相同的元素两次。

示例:给定nums=[2,7,11,15],target=9

因为nums[0]nums[1]=27=9,所以返回[0,1]

我目前的代码是:

def twosum_indices(nums, target):
    for i in nums:
        for v in nums[i + 1:]:
            if i + v == target:
                return nums.index(i), nums.index(v)

在这种情况下,Nums是一个整数列表,程序必须在列表中返回两个不同的索引,这样它们的真实值加起来就是给定的目标。尽管这在大多数测试用例上运行良好,但它在像[3,3]这样两个值相同的列表中失败,并且返回两次相同的索引,比如[0,0],而不是返回[0,1]的实际答案。为什么会发生这种情况?

共有3个答案

柯镜
2023-03-14
def twosum_indices(nums, target):
    for i in range(len(nums)):
        for v in range(len(nums)):
            if nums[i] + nums[v] == target and i != v:
                return i, v
汲灿
2023-03-14
#! /usr/bin/env python3


def two_sum_indices(nums, target):

    def dup(i, j):
        return i == j

    d = {num: i
         for i, num in enumerate(nums)}

    for i, num in enumerate(nums):
        if target - num in d:
            if not dup(i, d[target - num]):
                return i, d[target - num]
    return -1, -1


if __name__ == '__main__':

    print(two_sum_indices([2, 7, 11, 15], target=9))
    print(two_sum_indices([3], target=6))
    print(two_sum_indices([3, 3], target=6))
宇文德明
2023-03-14

代码中存在多个错误,其中最重要的一个错误是未能使用enumerate而不是list.index。例如,[3,3]。索引(3)当然总是0。

这个答案的重点不是找到最有效的解决方案,而是改进您的具体方法。你也可以看到O(n)解。

先决条件是,首先要了解列表中如何存在多个for循环。

def sums(nums):
    return [x + y for x in nums for y in nums[:x]]

以上相当于:

def sums(nums):
    output = []
    for x in nums:
       for y in nums[:x]:
           output.append(x + y)
    return output
def twosum_indices(nums, target):
    return next((i, j) for i in range(len(nums)) for j in range(len(nums[:i])) if (nums[i] + nums[j] == target))

例子:

print(sorted(twosum_indices([2, 7, 11, 15], 9)))
[0, 1]

print(sorted(twosum_indices([3, 3], 6)))
[0, 1]

这是一个稍微简单一点的迭代工具

import itertools

def twosum_indices_it(nums, target):
    return next((i, j) for (i, x), (j, y) in itertools.combinations(enumerate(nums), 2) if (x + y == target))

例子:

print(sorted(twosum_indices_it([2, 7, 11, 15], 9)))
[0, 1]

print(sorted(twosum_indices_it([3, 3], 6)))
[0, 1]
 类似资料:
  • 问题内容: 今天,有人陪我一起滥用Java 中的关键字。我编写了一个简单的循环来验证数组中是否存在某些内容。假设是一个length数组,这是我的代码: 现在有人告诉我这不是一个很好的编程,因为我在循环内使用了该语句,这将导致垃圾回收发生故障。因此,更好的代码将是: 问题是我无法正确解释为什么第一个for循环不是一个好习惯。有人可以给我一个解释吗? 问题答案: 现在有人告诉我这不是一个很好的编程,因

  • 我有一个基于Euler项目问题3的代码:“13195的素数因子是5、7、13和29。600851475143中最大的素数因子是什么?” 我在下面有一个我认为可行的代码,但第9行()不断返回错误:“索引器:列表索引超出范围”。当我在for循环中移动时,似乎并没有修改列表,所以我不确定出了什么问题。 有人知道我哪里错了吗? 非常感谢。

  • 我有三块地 小时——分钟——和总数 如果小时或分钟发生变化,我想计算一个总数。如果总数发生变化,我想计算相应的分钟和小时数。 例子: 1h 30分钟=1.5总计 2.25总计=2h 15分钟 我正试图用手表来达到这个目的 但是,这会导致一个循环,因为on处理程序总是调用另一个处理程序。如何以更明智的方式实现这一点?

  • 问题内容: 我在http://www.leepoint.net/notes- java/flow/loops/foreach.html上 阅读。每个等价于 是 我的问题是每个循环的空列表如何工作。我知道对于常规的for循环,arr.length只会计算为0,并且循环不会执行。每个循环的呢? 问题答案: 我的问题是每个循环的空列表如何工作 也以相同的方式工作。如果长度为零,则永远不会执行循环。 它们

  • 问题内容: 如何在如下所示的循环中访问索引? 我想得到以下输出: 当我使用循环遍历它时,如何访问循环索引(在这种情况下为到)? 问题答案: 使用其他状态变量,例如索引变量(通常在或等语言中使用),被认为是非的。 更好的选择是使用 中都提供的内置函数:

  • 问题内容: 假设我有一个像这样的循环: 快速提问:是否会停止循环本身的执行? 问题答案: 是的,停止执行并退出功能。always**会立即退出其功能,如果它位于for循环中,则不会进一步执行。 它很容易为您自己验证: **注意:请参阅有关的特例的其他答案,以及有关forEach循环如何具有自己的功能范围的答案,不会脱离包含函数。