2014-02-13 3 views
1

У меня есть списки, как:Сортировка списков в Python, основанные на правиле

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

Я хочу, чтобы отсортировать их так, что у меня всегда есть поля, начиная с первого "pt=", а остальные из них отсортированных в алфавитном порядке.

, так что результат будет:

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

Как я могу идти об этом?

+3

Там нет даты или что-нибудь еще в списках. Что означает «хронологический порядок» в данном случае? –

+0

В вашем образце используется * восходящий ** лексикографический ** порядок *. Для текста это алфавитно. –

ответ

5

Возвращает кортеж за единицу:

sorted(yourlist, key=lambda x: (not x.startswith('pt='), x)) 

Это будет сортировать любое значение, начиная с pt= первых (как False сортов, прежде чем True), любое другое значение сортируется лексикографически (что означает то же, алфавитный при применении к текст).

Демо:

>>> samples = [ 
...  ['pt=media:song','class=song', 'object=mp3'], 
...  ['class=text','pt=transaction:email', 'object=email'], 
...  ['category=where','pt=text:where','class:question'], 
...  ['object:mp4','class=movie', 'pt=media:movie'], 
... ] 
>>> for sample in samples: 
...  print sorted(sample, key=lambda x: (not x.startswith('pt='), x)) 
... 
['pt=media:song', 'class=song', 'object=mp3'] 
['pt=transaction:email', 'class=text', 'object=email'] 
['pt=text:where', 'category=where', 'class:question'] 
['pt=media:movie', 'class=movie', 'object:mp4'] 
Смежные вопросы