检查两个连续列表编号的乘积是否等于另一个编号

时间:2019-01-29 02:16:24

标签: python-3.x list loops

代码打印出2和3,因为它们的乘积等于变量num。但是,如果l = [1,3,4,5,6,7,8,9,10]怎么办?列表中没有数字乘以6,所以我想打印两个最接近的数字。

l=[1,2,3,4,5,6,7,8,9,10]
num=6
index=0
while index+1<len(l):
   if l[index]*l[index+1]==num:
      print(l[index],l[index+1])
   index+=1

2 个答案:

答案 0 :(得分:1)

要查找其乘积最接近num的货币对的索引,您可以执行以下操作:

代码:

min((abs(x*y - num), i) for i, (x, y) in enumerate(zip(l, l[1:])))[1]

说什么?

这使用生成器表达式和min()查找乘积最接近num的对。在该链中是:

zip(l, l[1:])

为每个邻居对生成一个元组。然后enumerate也用于生成索引。然后乘积的绝对值-num传递给min()

答案 1 :(得分:1)

您可以使用min通过简单的表达式来做到这一点:

首先,我们使用zip为连续元素构建迭代器:zip(l, l[1:])

然后我们使用min,其中key是距num的距离:

min(zip(l, l[1:]), key = lambda x: abs(x[0]*x[1]-num))

如果l = [1,2,3,4,5,6,7,8,9,10]

输出:

(2, 3)

如果l = [1,3,4,5,6,7,8,9,10]

输出:

(1, 3)

如果您想获得更多的输出,请考虑以相同的方式使用sorted来获得排名:

sorted(zip(l, l[1:]), key = lambda x: abs(x[0]*x[1]-num))

如果l = [1,3,4,5,6,7,8,9,10]

输出:

[(1, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10)]

如果l = [1,2,3,4,5,6,7,8,9,10]

输出:

[(2, 3), (1, 2), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10)]