取字符串数字列表的最大值



我有一个这样的列表lst = ['1.8.6.8', '1.8.8.879', '1.8.8.880', '1.8.10.883', '1.8.10.884'].我想取最大值,以便它独立评估由.分隔的每个块,然后返回1.8.10.884max(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'

我将其作为将这些步骤组合到一个表达式中的练习。

最新更新