2014-02-19 140 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']