这是 super 糟糕和困惑的,我是新手,请帮助我。
基本上,我试图从列表中找到两个加起来等于目标数字的数字。
我已经用 lst = [2, 4, 6, 10] 和目标值 target = 8 设置了一个示例。此示例中的答案是 (2, 6) 和 (6, 2)。
下面是我的代码,但它又长又丑,我相信有更好的方法。你能看看我如何改进下面的代码吗?
from itertools import product, permutations
numbers = [2, 4, 6, 10]
target_number = 8
two_nums = (list(permutations(numbers, 2)))
print(two_nums)
result1 = (two_nums[0][0] + two_nums[0][1])
result2 = (two_nums[1][0] + two_nums[1][1])
result3 = (two_nums[2][0] + two_nums[2][1])
result4 = (two_nums[3][0] + two_nums[3][1])
result5 = (two_nums[4][0] + two_nums[4][1])
result6 = (two_nums[5][0] + two_nums[5][1])
result7 = (two_nums[6][0] + two_nums[6][1])
result8 = (two_nums[7][0] + two_nums[7][1])
result9 = (two_nums[8][0] + two_nums[8][1])
result10 = (two_nums[9][0] + two_nums[9][1])
my_list = (result1, result2, result3, result4, result5, result6, result7, result8, result9, result10)
print (my_list)
for i in my_list:
if i == 8:
print ("Here it is:" + str(i))
请您参考如下方法:
对于列表中的每个数字,您都可以寻找他的互补数字(当添加到前一个数字时将给出所需的 target 总和)。如果存在,则获取对并退出,否则继续。
这看起来像下面这样:
numbers = [2, 4, 6, 10]
target_number = 8
for i, number in enumerate(numbers[:-1]): # note 1
complementary = target_number - number
if complementary in numbers[i+1:]: # note 2
print("Solution Found: {} and {}".format(number, complementary))
break
else: # note 3
print("No solutions exist")
产生:
Solution Found: 2 and 6
注意事项:
- 您不必检查最后一个号码;如果有一对,你到时候就已经找到了。
- 请注意,成员检查(在列表中成本很高)已优化,因为它仅考虑切片
numbers[i+1:]。以前的数字已经检查过了。切片的一个积极的副作用是列表中存在例如一个4,不会为8的目标值提供一对。 - 这是一个很好的设置,可以解释
for循环中else被误解且经常混淆的用法。else仅在循环未被break突然结束时触发。
如果例如 4 - 4 解决方案即使在 单个 4 中也是可以接受的您可以按如下方式修改列表:
numbers = [2, 4, 6, 10]
target_number = 8
for i, number in enumerate(numbers):
complementary = target_number - number
if complementary in numbers[i:]:
print("Solution Found: {} and {}".format(number, complementary))
break
else:
print("No solutions exist")
