我是python编程的新手。如何优化此代码?它还给出了一个错误UnboundLocalError:在赋值之前引用的局部变量'list1'。但是如果我在循环外定义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]**
答案 0 :(得分:3)
首先,如果未定义list1
,则无法在list1
上使用切片,因此您应该编写list1[0:2] = ints[i], ints[j]
而不是写list1 = [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]