【问题标题】:How to optimize this python function?如何优化这个python函数?
【发布时间】:2018-02-27 22:54:41
【问题描述】:

我是python编程新手。如何优化这段代码?它还给出了一个错误 UnboundLocalError: local variable 'list1' referenced before assignment.但如果我在循环之外定义 list1 ,则执行大型列表需要花费太多时间。

def sum_pairs(ints, s):
    list2 = []
    for i in range(len(ints)):
        if i == len(ints) - 1:
            break
        for j in range(i + 1, len(ints)):
            if i != j and (ints[i] + ints[j] == s):
                list1 = []
                if list2 == []:
                    list1[0:2] = ints[i], ints[j]
                    list2[0:2] = i, j
                elif list2[-1] > j:
                    list1[0:2] = ints[i], ints[j]
                    list2[0:2] = i, j

                break
     if list1 == []:
        return None
    return list1
print(sum_pairs([10, 5, 2, 3, 7, 5], 10))

我正在编写一个函数,它按照出现的顺序返回前两个值(请从左边解析),加起来形成总和。例如:

  **sum_pairs([10, 5, 2, 3, 7, 5], 10)
 #                 ^-----------^   5 + 5 = 10, indices: 1, 5
 #                       ^--^      3 + 7 = 10, indices: 3, 4 *
 #  * entire pair is earlier, and therefore is the correct answer
 == [3, 7]**

【问题讨论】:

  • 您能否深入了解您希望该函数做什么?
  • 在不知道您要做什么的情况下,我可以看到一些问题:您通过在for 循环中将list1 设置为[] 来不断覆盖list1。那可能不是你想要的。 if i is not j 也应该是 if i != j - 您需要测试是否相等,而不是对象身份。此外,您的缩进已关闭。
  • 我正在编写一个函数,它按照出现的顺序返回前两个值(请从左边解析),加起来形成总和。例如。 sum_pairs([10, 5, 2, 3, 7, 5], 10) # ^-----------^ 5 + 5 = 10,索引:1, 5 # ^--^ 3 + 7 = 10, indices: 3, 4 * # * 整对较早,因此是正确答案 == [3, 7]
  • 您的 list1 似乎没有在范围内定义,您可以验证缩进吗?

标签: python python-3.x function optimization


【解决方案1】:

首先,如果未定义list1,则不能在list1 上使用切片,因此您应该编写list1[0:2] = ints[i], ints[j],而不是编写list1[0:2] = ints[i], ints[j]。 其次,算法本身效率不高。不是在所有值上循环,而是对每个值再次循环,其复杂度为 O(n²),使用集合并执行单个循环具有 O(n log n) 复杂度。

看看下面的代码效率更高:

def sum_pairs(ints, s):
    encountered = set()
    for i in range(len(ints)):
        if s-ints[i] in encountered:
            return [s-ints[i], ints[i]]
        encountered.add(ints[i])

print(sum_pairs([10, 5, 2, 3, 7, 5], 10))

这给出:[3, 7]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-25
    • 2016-07-16
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2019-04-06
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多