两个 Sum,将值从内部传递给函数调用?

Two Sum, Pass value from inside to function call?

我试图将总和满足目标的唯一对传递给函数调用。 python 有点新,所以让我知道如何修复它。

array = [ 3, 4, 5, 9, 10, -1, 6 ]
target = 9
def twoSum (array, target):
    for i in range(0, len(array)):
        for x in range( i + 1, len(array)):
            totalOfTwo = array[i] + array[x]
            if (totalOfTwo == target):
                pairsList = (array[i], array[x])
    return -1
result = twoSum (array, target)

if result != -1:
    print ("the intergers numbers meet target", result)
else:
    print ("result is not in range")

您忘记了return结果

你的代码

array = [ 3, 4, 5, 9, 10, -1, 6 ]
target = 9
def twoSum (array, target):
    for i in range(0, len(array)):
        for x in range( i + 1, len(array)):
            totalOfTwo = array[i] + array[x]
            if (totalOfTwo == target):
                pairsList = (array[i], array[x]) ##### THIS #####
    return -1
result = twoSum (array, target)

if result != -1:
    print ("the intergers numbers meet target", result)
else:
    print ("result is not in range")

我的代码

array = [ 3, 4, 5, 9, 10, -1, 6 ]
target = 9
def twoSum (array, target):
    for i in range(0, len(array)):
        for x in range( i + 1, len(array)):
            totalOfTwo = array[i] + array[x]
            if (totalOfTwo == target):
               return (array[i], array[x]) ##### THIS ####
    return -1
result = twoSum (array, target)

if result != -1:
    print ("the intergers numbers meet target", result)
else:
    print ("result is not in range")

但这只是第一个结果,所以...

array = [ 3, 4, 5, 9, 10, -1, 6 ]
target = 9
def twoSum (array, target):
    rsts = [] # save rsts hear
    for i in range(0, len(array)):
        for x in range( i + 1, len(array)):
            totalOfTwo = array[i] + array[x]
            if (totalOfTwo == target):
               rsts.append((array[i], array[x])) # add answer to rsts
    return -rsts
result = twoSum (array, target)

如果我们没有正确答案结果是一个空列表([]),所以

if result != []: # changed -1 with []
    print ("the intergers numbers meet target", result)
else:
    print ("result is not in range")

我想这就是您要找的东西?

您需要将这些对添加到列表中,如果找到的话 return 它们。

此外,如果找到 none,我个人会 return 空列表而不是 -1,因为它们是不同的数据类型。

array = [ 3, 4, 5, 9, 10, -1, 6 ]
target = 9
def twoSum (array, target):
    pairsList = []
    for i in range(0, len(array)):
        for x in range( i + 1, len(array)):
            totalOfTwo = array[i] + array[x]
            if (totalOfTwo == target):
                pairsList.append((array[i], array[x]))
    if len(pairsList) == 0:
        return -1
    else:
        return pairsList
result = twoSum (array, target)

if result != -1:
    print ("the intergers numbers meet target", result)
else:
    print ("result is not in range")

最 Pythonic 的实现方式是作为列表理解,它只是一行!

>>> [(a[i],a[j]) for i in range(0, len(a)-1) for j in range(i+1, len(a)-1) if a[i]+a[j]==target]

[(4, 5), (10, -1)]

(请注意,这有助于提前终止,但您可以只分割第 [0] 个元素。)

至于你的代码/功能方法,我会重写它(下次请在 CodeReview.SE 上而不是在 SO 上请求对工作代码的审查):

def two_sum (a, target):
    for i in range(0, len(a)):
        for j in range( i + 1, len(a)):
            if a[i] + a[j] == target:
                return (a[i], a[j])
    return None

result = two_sum (a, target)

if result:
    print ("the numbers sum to target", result)
else:
    print ("result is not in range")

评论:

  • 由于您将第一个索引称为 i,将第二个索引称为 j,而不是 x,这使得不清楚 x 是值还是索引
  • 它比 return 更 Pythonic 到 return None 像 -1 这样的标记值。然后调用者可以只用 if result: 测试 return 的值,你不需要任何笨重的 if result != -1if result is None
  • 已将 twoSum 重命名为 two_sum 以遵循 Python 函数名称和变量的命名约定 (PEP-8):lower_case_with_underscores
  • 请注意此实现会提前终止。但是,如果您只是将 return (a[i], a[j]) 更改为 yield (a[i], a[j]),这将使其成为一个按顺序 returns 所有(/任何)匹配元组的生成器。 (您需要将 return None 替换为 yield StopIteration
  • 类似地,totalOfTwo 将被称为 total_of_twopair_sum
  • totalOfTwopairsList不需要声明临时变量,直接使用表达式即可
  • 如果您来自 Java,建议您学习正确的 Python 术语。 pairsList 不是一个列表,它是一个元组。 array 不是一个数组,它是一个列表。但我只是称它为 a.
  • 注意我们只需要 运行 左索引 i 到 len(a)-1 而不是 len(a),因为我们知道我们需要 j 来索引一个元素在它的右边。