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

时间:2015-11-13 13:02:08

标签: 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”将它们填入排序字符串,然后将它们合并。

用Python更聪明的方式吗?

3 个答案:

答案 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