我的目标是对字符串列表进行排序,其中单词必须按字母顺序排序。除了以“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
我只是在寻找替代方法来实现这一点,或者是否有人可以发现上述代码的任何问题。
答案 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']
为了排序,此键功能会替换以S
或s
开头的每个值,其中\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)
使用元组是有效的,因为元组比较是元素的词典编纂,因此在排序中,组代码的重量将超过元素。