【问题标题】:How to find pair of numbers that sums up to a given value?如何找到总和为给定值的一对数字?
【发布时间】:2020-12-11 12:30:30
【问题描述】:

我想编写一个函数,它接受一个不同的正整数列表和一个目标正整数值,然后返回一个整数对的列表,其中每对总和为目标值。

这是我的代码,但它只显示一对数字:

def pairsum(list1, target):
  for i in range(len(list1) -1):
    for j in range(i + 1 ,len(list1)):
      if list1[i]+ list1[j] == target:
        return (list1[i], list1[j])

pairsum([3,2,6,1,5,4], 7)

当我调用pairsum([3,2,6,1,5,4], 7) 时,输出是(3,4),应该是[(1,6), (2,5), (3,4)]。结果应按每个元组中第一个元素的升序排列。我不允许进口任何东西

【问题讨论】:

  • 输出是一对,因为这就是您的代码要返回的内容。
  • 我可以改变什么来获得所有的配对?

标签: python python-3.x


【解决方案1】:
def pairsum(a_list, num):
    pool = a_list.copy()
    first = pool.pop()
    res = []

    while True:
        for second in pool:
            if first + second == num:
                break

        if first < second:
            res.append((first, second))
        else:
            res.append((second, first))

        pool.remove(second)

        if pool:
            first = pool.pop()
        else:
            break

    return sorted(res)

#[(1, 6), (2, 5), (3, 4)]
print(pairsum([3,2,6,1,5,4], 7))

【讨论】:

  • 谢谢,可以对输出进行排序吗?所以我们得到 [(1,6), (2,5), (3,4)] 而不是 [(4, 3), (5, 2), (1, 6)]
【解决方案2】:

你可以试试这个,

def pairsum(list, target):
    result = []
    loop = 1
    for x in list:
        for y in list:
            if x + y == target:
                result.append((x, y))
        list = list[loop:]
        loop += 1
    return result

【讨论】:

  • 谢谢,可以对输出进行排序吗?所以我们得到 [(1,6), (2,5), (3,4)] 而不是 [(4, 3), (5, 2), (1, 6)]
  • 不客气!你不应该得到相同的输出,因为在这段代码中我们删除了我们检查的项目。
  • 您的代码的问题是您应该将哪些项目提供您的条件保存在一个列表中。然后,当您的 for 循环完成并返回您保存项目的列表时,return 命令应该可以工作。
【解决方案3】:

这是一个使用 itertools 的单行代码:

import itertools

def pairsum(vals, target):
    return sorted([(a, b) for a, b in itertools.combinations(vals, 2) if a + b == target])

解释:

  • itertools.combinations(vals, 2) 创建所有 2 元素组合
  • “if”部分将它们过滤成总和为目标的组合
  • 接受的组合组合成一个元组列表,最终排序(按每个元组的第一个元素)

【讨论】:

  • 非常感谢,但我不能导入任何东西
  • 真可惜 ;)
【解决方案4】:

您的解决方案可能设计为使用复杂度为 O(n log n) 的优化算法(如果您进行巧妙的排序,您可能会降到 O(n) - 更多信息在这里 Is there an O(n) integer sorting algorithm?)。你提出的那个(也是我注意到的大部分提案)是 O(n^2)。

你可以试试这个代码,你不会得到更好的算法,但你仍然可以稍微改变逻辑(如果你只对值感兴趣,而不是索引,可以设置storage而不是dict):

def pairsum(list1, target):
    storage = {}
    output = []
    for i, value in enumerate(list1):
        if value in storage:
            pair = tuple(sorted([value, target-value]))  # you can easily transform it to return indices of elements:
            # pair = tuple(i, storage[value])
            output.append(pair)
            # storage.pop(value)  # consider adding this line in case you want to handle reuses of the same value
        else:
            storage[target-value] = i
    return sorted(output)

阅读 cmets 以根据您的需要进行调整。 给定测试的输出 (pairsum([3,2,6,1,5,4], 7)):
[(1, 6), (2, 5), (3, 4)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多