python中的Max和Min方法,返回不正确的值

时间:2019-01-03 13:48:35

标签: python max min string-comparison

我从Python离开了很久之后才开始使用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的正确值。

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

6 个答案:

答案 0 :(得分:5)

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

如果要将这些字符串值与它们的实际数字值进行比较,则必须将key参数传递给max / min

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

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

当然,这要求您所有的元组值都必须是浮点数/整数的字符串表示形式。如果您使用非数字字符串(例如'abc'),则此操作将无效。

答案 1 :(得分:3)

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

字符串比较是按字典顺序进行的,因此最大值为“ 6.0”。

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

max(yourTupple, key = float)

答案 2 :(得分:1)

tupple的元素是字符串,您可以将键函数赋予max和min:

mDirection

答案 3 :(得分:1)

您可以将密钥传递给其他人指出的最小值或最大值,也可以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

答案 4 :(得分:1)

元组中的值定义为字符串。如果希望将它们视为浮点型,则在定义元组时不要使用括号:

myTuple =(44.0,34.0,17.0,6.0,15.0)

print(min(myTuple))#6.0

print(max(myTuple))#44.0

答案 5 :(得分:0)

得到奇怪结果的原因是因为变量tupple中的项目都是字符串,并且字符串比较的工作方式不同于数字比较。在字符串比较中,每个字符串项中的第一个元素用于比较的第一遍。因此,在tupple的情况下,将在这些项目('4', '3 ', '1', '6', '1')之间进行比较。取其中的最大值将产生“ 6”,这是最大值(但在原始的tupple中表示“ 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