在Python中对列表进行排序,但保留具有前缀的组

时间:2017-06-20 13:57:21

标签: python list sorting

我有一个这样的清单:

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)

但它并不是很好......

4 个答案:

答案 0 :(得分:6)

返回boolint对。 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']