我想从列表中获取最大值。
O(nlogn)
如果我打印出来,我会收到List = ['1.23','1.8.1.1']
print max(List)
而不是1.8.1.1
。
我做错了什么?
答案 0 :(得分:1)
最简单的方法是使用元组比较 说:
versions = ['1.23','1.8.1.1']
def getVersionTuple(v):
return tuple(map(int, v.strip().split('.')))
现在您可以使用print(max(map(getVersionTuple, versions)))
来获得最大值。
修改强>:
您可以使用'.'.join(map(str, m))
获取原始字符串(给定m
保存最大元组)。
答案 1 :(得分:0)
这些不是数字,它们是字符串,因此它们按字典顺序排序。由于字符8在2之后,因此返回1.8.1.1
作为最大值。
解决此问题的一种方法是编写自己的比较函数,该函数将字符串的每个部分作为int
并以数字方式对其进行比较:
def version_compare(a, b):
a_parts = a.split('.')
b_parts = b.split('.')
a_len = len(a_parts)
b_len = len(b_parts)
length = min(a_len, b_len)
# Compare the parts one by one
for i in range(length):
a_int = int(a_parts[i])
b_int = int(b_parts[i])
# And return on the first nonequl part
if a_int != b_int:
return a_int - b_int
# If we got here, the longest list is the "biggest"
return a_len - b_len
print sorted(['1.23','1.8.1.1'], cmp=version_compare, reverse=True)[0]
答案 2 :(得分:0)
类似的方法 - 假设这些字符串是版本号 - 是将版本字符串转换为整数列表:
4n
比较字符串时,会逐个字符地对它们进行比较,因此任何字符串都以' 2'开头。将在以' 8'开头的字符串前排序例如。