在python中排序列表

时间:2013-07-12 05:49:52

标签: python sorting

我的目标是对字符串列表进行排序,其中单词必须按字母顺序排序。除了以“s”开头的单词应该在列表的开头(它们也应该排序),然后是其他单词。

以下功能对我有用。

def mysort(words):
    mylist1 = sorted([i for i in words if i[:1] == "s"])
    mylist2 = sorted([i for i in words if i[:1] != "s"])
    list = mylist1 + mylist2
    return list

我只是在寻找替代方法来实现这一点,或者是否有人可以发现上述代码的任何问题。

4 个答案:

答案 0 :(得分:8)

可以在一行中完成,例如

sorted(words, key=lambda x: 'a'+x if x[:1] == 's' else 'b'+x)

或者:

sorted(words, key=lambda x: 'a'+x if x.startswith('s') else 'b'+x)

(更具可读性。)

sorted()接受一个关键字参数'key',用于在比较完成之前“翻译”列表中的值。

例如:

sorted(words, key=str.lower)
# Will do a sort that ignores the case, since instead of checking
# 'A' vs. 'b' it will check str.lower('A') vs. str.lower('b')

sorted(intlist, key=abs)
# Will sort a list of integers by magnitude, regardless of whether they're
# negative or positive.

>>> sorted([-5,2,1,-8], key=abs)
[1, 2, -5, -8]

我在进行排序时使用了这样的翻译字符串:

“你好”=> “bhello”
“steve”=> “asteve”

所以“史蒂夫”会在“你好”之前出现

答案 1 :(得分:5)

1。您可以在sorted内使用generator expression

2。您可以使用str.startswith

3。不要将list用作变量名。

4。在排序中使用key=str.lower

mylist1 = sorted((i for i in words if i.startswith(("s","S"))),key=str.lower)
mylist2 = sorted((i for i in words if not i.startswith(("s","S"))),key=str.lower)
return mylist1 + mylist2

为什么str.lower

>>> "abc" > "BCD"
True
>>> "abc" > "BCD".lower()  #fair comparison
False

答案 2 :(得分:1)

>>> l = ['z', 'a', 'b', 's', 'sa', 'sb', '', 'sz']
>>> sorted(l, key=lambda x:(x[0].replace('s','\x01').replace('S','\x01') if x else '') + x[1:])
['', 's', 'sa', 'sb', 'sz', 'a', 'b', 'z']

为了排序,此键功能会替换以Ss开头的每个值,其中\x01在其他所有值之前排序。

答案 3 :(得分:1)

Integer回答的一行我喜欢使用元组稍微好一点,因为它更干净,也更通用(适用于任意元素,而不仅仅是字符串):

sorted(key=lambda x : ((1 if x[:1] in ("S", "s") else 2), x))

说明:

key参数允许根据f(item)的值而不是item的值对数组进行排序,其中f是一个任意函数。

在这种情况下,函数是匿名的(lambda)并返回一个元组,其中第一个元素是您希望元素结束的“组”(例如,如果字符串以“s”开头则为1,否则为2)

使用元组是有效的,因为元组比较是元素的词典编纂,因此在排序中,组代码的重量将超过元素。