我有一个这样的列表lst = ['1.8.6.8', '1.8.8.879', '1.8.8.880', '1.8.10.883', '1.8.10.884']
.我想取最大值,以便它独立评估由.
分隔的每个块,然后返回1.8.10.884
。max(lst)
返回1.8.8.880
.有没有一种巧妙的方法可以做到这一点,而无需通过.
拆分它,然后循环遍历每个子集?
max(lst)
返回1.8.8.880
因为字符串按字典顺序进行比较。
要将它们作为整数进行比较,您必须按.
拆分并将元素转换为整数。但是,您可以使用元组/列表比较来执行排序,而不是遍历每个子集。例如:
[1, 2, 3] > [1, 1, 3] # True
[1, 2, 3] > [1, 2, 4] # False
但是,这并不考虑列表的长度:首先包含较小元素的列表被选为较小的列表。
[1, 2, 3] > [1, 1, 100, 1000] # Gives True
为了解决这个问题,我们将返回一个元组,其中包含列表的长度和列表本身。此外,我们将对max
函数使用key
参数:
def convert_function(elem):
vals = [int(a) for a in elem.split('.')]
return (len(vals), vals)
lst = ['1.8.68', '1.8.8.879', '1.8.8.880', '1.8.10.883', '1.8.10.884']
max(lst, key=convert_function) # gives '1.8.10.884'
首先拆分.
上的每个字符串并将字段转换为整数。
>>> t1 = [[int(x) for x in y.split('.')] for y in lst]
>>> t1
[[1, 8, 68], [1, 8, 8, 879], [1, 8, 8, 880], [1, 8, 10, 883], [1, 8, 10, 884]]
然后压缩元组并将max
映射到结果上。
>>> from itertools import zip_longest
>>> t2 = [max(x) for x in zip_longest(*t1, fillvalue=0)]
>>> t2
[1, 8, 68, 884]
最后,将t2
元素联接到单个字符串中。
>>> '.'.join(map(str, t2))
'1.8.68.884'
我将其作为将这些步骤组合到一个表达式中的练习。