我有以下列表:
['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']
我该怎么做?
答案 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))