2014-02-19 105 views
0

我有这样的列表:排序列表

['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'] 

我怎么去呢?

+1

类似http://stackoverflow.com/a/21762295/538284的[在Python排序列表 –

+0

可能重复的基础在规则](http://stackoverflow.com/questions/21762177/sort-lists-in-python-based-on-a-rule) – Carpetsmoker

回答

0

排序与tuple键,其前两个元素检查c=pt=

.sort(key=lambda x:(not x.startswith('c='), not x.startswith('pt='), x)) 
+0

谢谢,这个作品! – user1189851

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

这将在正确的顺序,然后其余的字母你的两个特价:

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']