【问题标题】:Max and Min methods in python, returning incorrect values [duplicate]python中的Max和Min方法,返回不正确的值[重复]
【发布时间】:2019-05-30 02:51:01
【问题描述】:

我刚刚开始在 Python 中长期使用编程语言,我正在编写一个从文件中读取数据以检索值的程序。目前我已经有问题的程序从文件中读取并将某些值放入一个元组中,但是,我现在面临的问题是从我在 python 中的元组列表中返回最小值和最大值,我的值列表元组列表中有:

tuple = ('44.0', '34.0', '17.0', '6.0','15.0') 

但是,当我使用max 调用max(tuple) 时,我的结果是6.0,而不是44.0 的正确答案。同样,如果我尝试使用min(tuple) 返回最小值。相反,我得到了15.0 的值,而不是6.0 的正确值。

请问,您能否建议我如何解决这个问题,以便我可以返回正确的值?

【问题讨论】:

  • 元组中的值是字符串,当你对它们应用 max 时,你会得到字母顺序最大的字符串。首先将它们转换为数字。
  • @Rakesh lambda 包装 float 是多余的。
  • @snakecharmerb 也发现了一个 - 但它是关于排序,而不是最小/最大值,尽管解决方案是相似的

标签: python max min string-comparison


【解决方案1】:

默认情况下,字符串的比较是lexicographical。这意味着“9”在字典上大于“10”,因为“9”的ASCII值(57)大于“1”的ASCII值(49),以此类推。

如果您想通过它们的实际数值比较这些字符串值,您必须将key 参数传递给max/min

max(tupple, key=float)
# '44.0'

min(tupple, key=float)
# '6.0'

当然,这要求所有元组值都是浮点数/整数的字符串表示形式。如果你有一个非数字字符串(例如'abc'),这将不起作用。

【讨论】:

    【解决方案2】:

    您得到的最大值是“6.0”,因为您实际上是在比较字符串而不是整数/浮点数。

    字符串比较是按字典顺序进行的,因此您会得到 '6.0' 作为最大值。

    您可以传递key 参数,以便比较是算术而不是字典,如下所示:

    max(yourTupple, key = float)
    

    【讨论】:

      【解决方案3】:

      元组的元素是字符串,可以给max和min赋予key函数:

       max(tupple, key=float) 44.0
       min(tupple, key=float) 6.0
      

      【讨论】:

        【解决方案4】:

        您可以将密钥传递给其他人指定的最小值或最大值,也可以将 map 元组传递给浮点数

        t = ('44.0', '34.0', '17.0', '6.0','15.0')
        print(min(map(float,t))) #prints 6.0
        print(max(map(float,t))) #prints 44.0
        

        还请避免命名变量tuple,因为这是内置函数的名称,例如tuple([1,2,3]) 是返回元组(1,2,3) 的合法python 语法,但如果您在代码中更早地放置例如tuple = (10,11,12) 它会产生TypeError

        【讨论】:

          【解决方案5】:

          您的元组中的值定义为string。如果您希望将它们视为float,则在定义元组时不要使用括号:

          myTuple = (44.0, 34.0, 17.0, 6.0, 15.0)
          
          print(min(myTuple)) # 6.0
          
          print(max(myTuple))  #44.0
          

          【讨论】:

            【解决方案6】:

            你得到奇怪结果的原因是变量元组中的项目都是字符串,字符串比较的工作方式与数字比较不同。在字符串比较中,每个字符串项中的第一个元素用于第一次比较。所以在元组的情况下,比较将在这些项目('4', '3 ', '1', '6', '1')之间进行。取其中的最大值将产生“6”,即最大值(但在原始元组中表示“6.0”),最小值为“1”(最后一个 1 表示 15.0)。

            为避免这种情况,您应该首先将字符串值转换为浮点数,然后根据需要取最大值和最小值...

            # convert the elements of tupple to float
            tupple = tuple(float(i) for i in tupple)
            print(tupple)
            # returns (44.0, 34.0, 17.0, 6.0, 15.0)
            
            # take the max of tupple
            max(tupple)
            # returns 44.0
            
            # take the min of tupple
            min(tupple)
            # returns 6.0
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-09-23
              • 1970-01-01
              • 2018-11-05
              • 2011-07-01
              • 2019-04-10
              • 2015-03-09
              • 2017-10-28
              • 2012-07-04
              相关资源
              最近更新 更多