【问题标题】:Check if the product of two consecutive list numbers equals another number检查两个连续列表数字的乘积是否等于另一个数字
【发布时间】:2019-01-29 02:16:23
【问题描述】:

代码打印出 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

【问题讨论】:

    标签: python-3.x list loops


    【解决方案1】:

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

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

    然后我们使用minkey 是与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)]
    

    【讨论】:

      【解决方案2】:

      要查找乘积最接近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()

      【讨论】:

      • @Primusa,这是真的,但是将索引变成一对是一个微不足道的扩展......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多