假设我有这样的清单:
['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更聪明的方式吗?
答案 0 :(得分:2)
使用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)
使用key
vs cmp
来提高效率。
答案 1 :(得分:1)
您可以使用函数提取字符串的相关部分,然后使用这些部分进行排序:
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]
提取的数字执行相同操作。
答案 2 :(得分:1)
您可以为sort()
对象的list
方法提供函数:
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的评论更改了代码;有关此问题的更多信息,请参见here。