【问题标题】:why is my function not always returning the correct list?为什么我的函数并不总是返回正确的列表?
【发布时间】:2013-05-04 18:43:21
【问题描述】:

我有一个函数,它接受两个输入,并将返回一个元组数组,其中给定元组中的两个数字与给定函数的两个数字具有完全相同的比率!

所以一切正常,但由于某些原因,在某些情况下,它并没有拾取每个元组。这是一个例子,我不知道为什么:

In [52]: def find_r(num1,num2):
   ....:         ratio = num1/float(num2)
   ....:         ratio = 1/ratio
   ....:         my_list = [(a,int(a * ratio)) for a in range(1,num1) if float(a * ratio).is_integer()] #and a * 1/float(ratio) + a <= num1]
   ....:         return my_list
   ....: 

In [53]: find_r(100,364)
Out[53]: [(75, 273)]

所以它只返回一个元组,但是如果你将 75 和 273 除以 3,你会得到一个 25 和 91 的元组,它们具有相同的比率!为什么我的函数没有拾取这个实例?

如果有帮助,我怀疑它与is_integer() 方法有关,但我不太确定。

谢谢!

【问题讨论】:

    标签: python list function tuples


    【解决方案1】:

    这是由于浮点运算的不精确性:

    >>> ((100/364)*364).is_integer()
    False
    >>> ((25/91)*91).is_integer()
    False
    

    您应该通过交叉乘法来检查分数的等价性,而不是做您正在做的事情。也就是说,给定一个分数a/b,要检查它是否等价于另一个c/d,检查是否ad == bc。这将避免除法并将所有内容保持为整数。

    你可以这样做:

    def find_r(num1,num2):
        return [(a, a*num2//num1) for a in range(1, num1) if (a*num2) % num1 == 0]
    
    >>> find_r(100, 364)
    [(25, 91), (50, 182), (75, 273)]
    

    (还有其他方法可以完成您的任务,但这与您最初的方法最相似。)

    【讨论】:

    • 这是有道理的,但不幸的是我无法检查分数的等价性,因为我是根据具有完全相同比率的项目来制作列表的。我只需要清除非整数,我会这样做,但正如你所指出的,一些整数确实读作浮点数,这是我的问题。
    • @RyanSaxe:比率是分数。请参阅我编辑的答案以了解如何做到这一点。
    【解决方案2】:

    我认为你得到了你期望的答案

    >>> r=100/float(364)
    >>> r
    0.27472527472527475
    >>> r=1/r
    >>> r
    3.6399999999999997
    >>> r*25
    90.99999999999999
    >>> r*75
    273.0
    

    要进行整数检查,您可以使用

    if(int(a*ratio) == a*ratio) 喜欢

    def find_r(num1,num2):
           ratio = num1/float(num2)
           ratio = 1/ratio
           my_list = [(a,int(a * ratio)) for a in range(1,num1) if int(a * ratio) == a * ratio] 
           for a in range(1,num1):
               if int(a * ratio) == a * ratio:
                   print a * ratio
           return my_list
    
    
    print find_r(100,364)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-24
      • 2015-09-13
      • 1970-01-01
      • 2019-03-24
      • 2013-01-09
      • 1970-01-01
      • 2021-11-16
      • 2020-10-08
      相关资源
      最近更新 更多