繁体   English   中英

自定义排序 python 中的列表,混合字母和数字

[英]Custom sort a list in python with mixed letters and numbers

我有一个包含 6 个字符串的列表:

s1 = 'foo[2]_bar'
s2 = 'foo[2]_ant'
s3 = 'foo[1]_bar'
s4 = 'foo[1]_ant'
s5 = 'foo[10]_bar'
s6 = 'foo[10]_ant'
str_arr = [s1, s2, s3, s4, s5, s6]

如果我使用str_arr.sort() ,则顺序如下:

foo[10]_ant
foo[10]_bar
foo[1]_ant
foo[1]_bar
foo[2]_ant
foo[2]_bar

但是,我需要顺序优先于字母排序,这意味着在所有情况下"ant"都应该排在"bar"之前,但也需要对数字顺序进行子排序。

所以我需要 output 是这样的,但我不知道如何做到这一点:

foo[1]_ant
foo[2]_ant
foo[10]_ant
foo[1]_bar
foo[2]_bar
foo[10]_bar

我不确定是否有某种过滤器或 lambda function 我可以使用,但我几乎无法理解我在这里看到的很多 lambda 功能。

使用具有多个条件的lambda 条件的优先级从左到右:

代码:

s1 = 'foo[2]_bar'
s2 = 'foo[2]_ant'
s3 = 'foo[1]_bar'
s4 = 'foo[1]_ant'
s5 = 'foo[10]_bar'
s6 = 'foo[10]_ant'
str_arr = [s1, s2, s3, s4, s5, s6]

str_arr.sort(key=lambda x: (x[x.find("_")+1], int(x[x.find("[")+1:x.find("]")])))
print(str_arr)

Output:

['foo[1]_ant', 'foo[2]_ant', 'foo[10]_ant', 'foo[1]_bar', 'foo[2]_bar', 'foo[10]_bar']

这个怎么运作:

(对于每个条目x

从左到右,我们有条件:

  1. x[x.find("_")+1:]这是第一个排序条件。 它将根据下划线后面的单词进行排序。 在这里,我们通过查找下划线来分割字符串,并返回出现在它之后的字符串部分。

  2. int(x[x.find("[")+1:x.find("]")])这是第二个排序条件。 它将根据字符串中[]之间的int进行排序。 它对字符串进行切片,因此我们只剩下那个数字,然后它将那个数字转换为int ,并将int与其他字符串中的整数进行比较。

如上所述,使用具有多个条件的lambda意味着它将从左到右优先排序条件。 Here, we prioritize sorting by the last word (so ant always comes before bar ), and then sorting by the integer (so 1...ant comes before 2...ant and so on.

另一种解决方案,使用re

import re

s1 = "foo[2]_bar"
s2 = "foo[2]_ant"
s3 = "foo[1]_bar"
s4 = "foo[1]_ant"
s5 = "foo[10]_bar"
s6 = "foo[10]_ant"
str_arr = [s1, s2, s3, s4, s5, s6]

pat = re.compile(r"\[(\d+)\]_(.*)")

print(sorted(str_arr, key=lambda k: ((m := pat.search(k))[2], int(m[1]))))

印刷:

[
    "foo[1]_ant",
    "foo[2]_ant",
    "foo[10]_ant",
    "foo[1]_bar",
    "foo[2]_bar",
    "foo[10]_bar",
]

进行自定义排序 function 然后将其作为键传递

您可以从自定义排序 function 中返回多个对象,并且将根据返回的顺序给予优先级。

s1 = 'foo[2]_bar'
s2 = 'foo[2]_ant'
s3 = 'foo[1]_bar'
s4 = 'foo[1]_ant'
s5 = 'foo[10]_bar'
s6 = 'foo[10]_ant'
str_arr = [s1, s2, s3, s4, s5, s6]

def custom_sort(x):
    last_str = x.split("_")[-1]
    num = x[x.index("[")+1: x.index("]")]
    return last_str, int(num)

for i in (sorted(str_arr, key=custom_sort)):
    print(i)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM