python中的Max和Min方法,返回不正确的值[重复]
Posted
技术标签:
【中文标题】python中的Max和Min方法,返回不正确的值[重复]【英文标题】:Max and Min methods in python, returning incorrect values [duplicate] 【发布时间】: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 时,你会得到字母顺序最大的字符串。首先将它们转换为数字。 @Rakeshlambda
包装 float
是多余的。
@snakecharmerb 也发现了一个 - 但它是关于排序,而不是最小/最大值,尽管解决方案是相似的
【参考方案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
【讨论】:
以上是关于python中的Max和Min方法,返回不正确的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章