我正在学习python,并且正在训练自己进行不同的练习。对于其中之一,我必须从列表中找到两个数字的乘积的最小和。为此,我想创建一个列表并按顺序对其进行排序,并创建第二个列表,在该列表中我将以相反的顺序对其进行排序,然后将每个列表的第一个元素的乘积求和并将它们加在一起。
这是一个小例子:
list[5, 4, 2, 3]
list_sorted = [2, 3]
list_sorted_rev = [5, 4]
expectation = 22
calcul made: 5 * 2 + 3 * 4
但是我有一个问题,当我在循环中执行此操作时,我的循环将使用第一个列表的第一个值遍历第二个列表,然后再转到第一个列表的第二个值。
这是我完成的代码。
def min_sum(arr):
my_list = []
my_rev = []
srt = sorted(arr)
rev = sorted(arr, reverse=True)
rng = len(arr) / 2
res = 0
for i in range(0, int(rng)):
my_list.append(srt[i])
my_rev.append(rev[i])
for i in my_rev:
for j in my_list:
res += i * j
print(res)
答案 0 :(得分:2)
不是使用嵌套的for循环:
for i in my_rev:
for j in my_list:
res += i * j
您必须同时遍历两个列表。可以使用zip(*iterables):
for i, j in zip(my_rev, my_list):
res += i * j
答案 1 :(得分:2)
这是因为您使用的是一个嵌套循环,使它在第一个列表上多次迭代。您可以改用以下代码:
def min_sum(arr):
my_list = []
my_rev = []
srt = sorted(arr)
rev = sorted(arr, reverse=True)
rng = len(arr) / 2
res = 0
for i in range(0, int(rng)):
my_list.append(srt[i])
my_rev.append(rev[i])
for ind in range(len(my_rev)):
res += my_rev[ind] * my_list[ind]
print(res)
min_sum([5, 4, 2, 3])