我有一个这样的清单:
a = ['1', '3', '02', 'WF2', 'WF5', 'WF01']
我希望这样排序:
a = ['1', '02', '3', 'WF01', 'WF2', 'WF5']
使用类似的东西:
def sortby(id):
if 'WF' not in id and id.isdigit():
return int(id)
elif 'WF' in id.upper():
return float('inf')
a.sort(key=sortby)
我可以在没有' WF'的情况下对整数进行排序。前缀,但我不知道如何对前缀为' WF'独自一人。
我是否需要使用双重排序,即再次排序并仅排序前缀为' WF'并且在没有' WF'的情况下为所有其他条目分配-Inf字首? 有什么想法吗?
修改:
def sortby(id):
if 'WF' not in id.upper():
return int(id)
return float('inf')
def sortby2(id):
if 'WF' not in id.upper():
return float('-inf')
return int(id.replace('WF', ''))
a.sort(key=sortby)
a.sort(key=sortby2)
但它并不是很好......
答案 0 :(得分:6)
返回bool
和int
对。 bool
将指定项目是以WF
开头,第二项是实际整数值。
>>> lst = ['1', '3', '02', 'WF2', 'WF5', 'WF01']
>>> def key(item):
... return item.startswith('WF'), int(item.lstrip('WF'))
...
>>> sorted(lst, key=key)
['1', '02', '3', 'WF01', 'WF2', 'WF5']
答案 1 :(得分:3)
只需返回一对作为键,第一个基于是否存在“WF”,第二个基于数字:
def sortby(id):
if 'WF' not in id and id.isdigit():
return (0,int(id))
elif 'WF' in id.upper():
return (1,int(id[2:]))
答案 2 :(得分:2)
您可以随时执行此操作:
a.sort(key=lambda x: (x[0] == "W", int(x.replace("WF", ""))))
答案 3 :(得分:2)
对元组进行排序,检查字符串是否以 'WF'
(优先级)开头,然后是int值:
a.sort(key=lambda x: (x.startswith('WF'), int(x.strip('WF'))))
print(a)
#['1', '02', '3', 'WF01', 'WF2', 'WF5']