根据条件对列表进行排序

时间:2014-02-19 20:17:55

标签: python list sorting

我有以下列表:

['pt=media:song', 'c=100','class=song', 'object=mp3']
['class=text','pt=transaction:email','c=90','object=email']
['c=97','category=where','pt=text:where','class:question']
['object:mp4','class=movie', 'pt=media:movie','c=56']

我想对它们进行排序,以便始终首先显示从'c='开始的字段,"pt="显示为第二个,其余字段按字母顺序排序。

所以结果将是:

['c=100','pt=media:song','class=song', 'object=mp3']
['c=90','pt=transaction:email','class=text', 'object=email']
['c=97','pt=text:where','category=where','class:question'] 
['c=56','pt=media:movie','class=movie','object:mp4']

我该怎么做?

3 个答案:

答案 0 :(得分:1)

此函数将item从开头的指定字符串开始,然后使用sorted将其余字符串按正确的顺序排列:

def rearrange(lst, s):
    for index, item in enumerate(lst):
        if item.startswith(s[0]):
            if len(s) == 1:
                return [item] + sorted(lst[:index] + lst[index+1:])
            else:
                return [item] + rearrange(lst[:index] + lst[index+1:], s[1:])

例如:

>>> rearrange(['object:mp4','class=movie', 'pt=media:movie','c=56'], 
              ("c=", "pt="))
['c=56', 'pt=media:movie', 'class=movie', 'object:mp4']

如果没有项目以相应的字符串开头,它将return None

答案 1 :(得分:1)

这将使您的两个特价顺序正确,然后按字母顺序休息:

In [212]: l = ['object:mp4','class=movie', 'pt=media:movie','c=56']

In [213]: specials = [i for i in l if i.startswith("c=") or i.startswith("pt=")]

In [214]: sorted(specials) + sorted(set(l).difference(specials))
Out[214]: ['c=56', 'pt=media:movie', 'class=movie', 'object:mp4']

答案 2 :(得分:0)

使用tuple键排序,前两个元素检查c=pt=

.sort(key=lambda x:(not x.startswith('c='), not x.startswith('pt='), x))
相关问题