Python 如何按特定顺序对字符串列表进行排序?

Python 如何按特定顺序对字符串列表进行排序?,python,string,list,sorting,Python,String,List,Sorting,假设我有这样一张清单: ['word_4_0_w_7', 'word_4_0_w_6', 'word_3_0_w_10', 'word_3_0_w_2'] 我想根据单词后面的数字和w后面的数字对它们进行排序。 它将如下所示: ['word_3_0_w_2', 'word_3_0_w_10', 'word_4_0_w_6', 'word_4_0_w_7'] 我们想到的是创建一组列表,并根据“word”之后的索引将它们填充为按“w”排序的字符串,然后合并

假设我有这样一张清单:

['word_4_0_w_7',
 'word_4_0_w_6',
 'word_3_0_w_10',
 'word_3_0_w_2']
我想根据单词后面的数字和w后面的数字对它们进行排序。 它将如下所示:

   ['word_3_0_w_2',
     'word_3_0_w_10',
     'word_4_0_w_6',
     'word_4_0_w_7']
我们想到的是创建一组列表,并根据“word”之后的索引将它们填充为按“w”排序的字符串,然后合并它们


Python中的方法更聪明吗?

您可以使用函数提取字符串的相关部分,然后使用这些部分进行排序:

a = ['word_4_0_w_7', 'word_4_0_w_6', 'word_3_0_w_10', 'word_3_0_w_2']

def sort_func(x):
    parts = x.split('_');
    sort_key = parts[1]+parts[2]+"%02d"%int(parts[4])
    return sort_key

a_sorted = sorted(a,key=sort_func)

表达式
%02d”%int(x.split(“”“)[4])
用于在第二个数字前面添加前导零,否则
10
将在
2
之前排序。您可能需要对通过
x.split(“”“)[2]
提取的数字执行相同的操作。您可以使用函数提取字符串的相关部分,然后使用这些部分进行排序:

a = ['word_4_0_w_7', 'word_4_0_w_6', 'word_3_0_w_10', 'word_3_0_w_2']

def sort_func(x):
    parts = x.split('_');
    sort_key = parts[1]+parts[2]+"%02d"%int(parts[4])
    return sort_key

a_sorted = sorted(a,key=sort_func)

表达式
%02d”%int(x.split(“”“)[4])
用于在第二个数字前面添加前导零,否则
10
将在
2
之前排序。您可能需要对通过
x.split('''u')[2]
提取的数字执行相同的操作。您可以为
列表
对象的
排序()方法提供一个函数:

l = ['word_4_0_w_7',
     'word_4_0_w_6',
     'word_3_0_w_10',
     'word_3_0_w_2']

def my_key_func(x):
    xx = x.split("_")
    return (int(xx[1]), int(xx[-1]))
l.sort(key=my_key_func)
输出:

print l
['word_3_0_w_2', 'word_3_0_w_10', 'word_4_0_w_6', 'word_4_0_w_7']

编辑:根据@dwanderson的评论更改代码;有关这方面的更多信息,请参见。

您可以为
对象列表的
排序()方法提供一个函数:

l = ['word_4_0_w_7',
     'word_4_0_w_6',
     'word_3_0_w_10',
     'word_3_0_w_2']

def my_key_func(x):
    xx = x.split("_")
    return (int(xx[1]), int(xx[-1]))
l.sort(key=my_key_func)
输出:

print l
['word_3_0_w_2', 'word_3_0_w_10', 'word_4_0_w_6', 'word_4_0_w_7']

编辑:根据@dwanderson的评论更改代码;有关这方面的更多信息,请参见。

使用Python的
功能,并结合其他答案:

def mykey(value):
    ls = value.split("_")
    return int(ls[1]), int(ls[-1])

newlist = sorted(firstlist, key=mykey)
## or, if you want it in place:
firstlist.sort(key=mykey)

Python使用
key
vs
cmp
将更加高效,请结合其他答案使用Python的
key
功能:

def mykey(value):
    ls = value.split("_")
    return int(ls[1]), int(ls[-1])

newlist = sorted(firstlist, key=mykey)
## or, if you want it in place:
firstlist.sort(key=mykey)

Python使用
key
vs
cmp
sorted(单词,key=lambda-word:(int(单词[5]),int(单词[11:]))
sorted(单词,key=lambda-word:(int(单词[5]),int(单词[11:]))
我认为建议使用
功能,而不是
cmp
,因为排序将计算
O(n)次,但可以执行O(n**2)
cmp
s(我认为)。简单的更改就是:
def key(x):xx=x.split(41;;返回int(xx[1])、int(xx[-1])
,然后进行
l.sort(key=mykey)
。输出将是相同的,但它更有效,并且是首选的Python方式。我认为建议使用
key
功能,而不是
cmp
,因为排序将计算
key
O(n)次,但可以做O(n**2)
cmp
s(我认为)。简单的更改就是:
def key(x):xx=x.split(“”);返回int(xx[1]),int(xx[-1])
然后
l.sort(key=mykey)
。输出将是相同的,但它更高效,并且是首选的Python方式。虽然lambda的一次性很好,而且这看起来确实很简单,但我要说的是,表达式足够复杂,这样的内联lambda是不可读/不可维护的。这样太容易发生格式错误,下一个人o出现并查看代码将需要花费几分钟的时间来梳理它的含义,如果它是正确的,我已经重构了代码,因此lambda是在单独的一行上定义的。您现在可以调用它来测试它是否工作。为什么不让它成为一个两行或三行函数呢?我的全部观点是很难读取/维护。分配ambda到一个函数,而不是使用一个函数本身,看起来更不可读,因为它可能会导致每个Python程序员暂停并问“现在为什么他们要费心分配lambda而不仅仅是生成一个普通函数?”我改变了,因为Guido van Rossum似乎也不喜欢lambda运算符,看,虽然lambda运算符非常适合一次性使用,但这看起来确实非常简单,我要说的是,表达式足够复杂,这样的内联lambda是不可读/不可维护的。太容易发生格式错误,而且下一个来的人g和查看代码将需要花费几分钟的时间来梳理它的含义,如果它是正确的,我已经重构了代码,因此lambda在单独的一行上定义。现在可以调用它来测试它是否有效。为什么不让它成为一个两行或三行函数呢?我的全部观点是很难读取/维护。将lambda分配给function,而不是使用一个函数本身,看起来更不可读,因为它可能会导致每个Python程序员暂停并问“现在为什么他们要费心分配lambda而不仅仅是生成一个普通函数?”我改变了,因为Guido van Rossum似乎也不喜欢lambda操作符,请参见