如何按字典顺序对字母数字字符串列表进行排序

How to sort a list of alphanumeric strings in lexicographic order

我有一个包含字母数字值的字符串列表,我想使用中间值作为参数对其进行排序。

例如,我有以下列表:

test = ["ykc 82 01" , "ao first qx" , "teste teste teste" , "a1 03 02" , "ga eai oie"]

我想对它进行排序,但使用第二个值作为参数,例如在这种情况下,所需的输出应该是:

["ga eai oie" , "ao first qx" , "teste teste teste" , "a1 03 02" , "ykc 82 01"]

第一个元素是中间有“eai”的字符串,因为它以字母“e”开头,第二个元素是中间有“first”的字符串,因为它以字母“f”开头,并且依此类推,最后的元素是包含数值的元素,顺序不限。

我尝试使用带键的排序功能进行排序,如下所示:

test.sort(key = lambda x: (x.split()[1]))

但它 returns 首先是包含数值的元素,然后是具有数字值的元素:

['a1 03 02', 'ykc 82 01', 'aa eai oie', 'eo first qx', 'teste teste teste']

你需要传入稍微复杂一点的key函数:

test.sort(key=lambda x: chr(123) if x.split()[1].isnumeric() else x)

这输出:

['ao first qx', 'ga eai oie', 'teste teste teste', 'ykc 82 01', 'a1 03 02']

解释:

任何字母字符的最高 ASCII 值是 122。使用 chr(123) 给我们一个字符,其 ASCII 值高于所有字母字符,这意味着完全是数字的字符串将放在最后。

您可以创建一个自定义排序函数,该函数 returns 一个二元组,将字母值放在前面,数值放在最后:

test = ["ykc 82 01" , "ao first qx" , "teste teste teste" , "a1 03 02" , "ga eai oie"]


def sort_func(value):
    _, mid, _ = value.split()
    return mid.isnumeric(), mid


print(sorted(test, key=sort_func))

输出:

['ga eai oie', 'ao first qx', 'teste teste teste', 'a1 03 02', 'ykc 82 01']