Python:如何自定义排序列表?
注意:我知道在Python中列表的顺序不是固定的,但我觉得这个列表应该是固定的。我使用的是Python 2.4。
我有一个列表,比如说是这样的:
mylist = [ ( u'Article', {"...some_data..."} ) ,
( u'Report' , {"...some_data..."} ) ,
( u'Book' , {"...another_data..."} ) ,
...#continue
]
这个变量mylist是通过一个函数得到的,而这个函数返回的列表顺序会有所不同。所以,有时候它的顺序就像例子那样。有时候,'Report'会在'Article'之前,等等。
我想要一个固定的顺序(而不是按字母顺序)。
假设我想要的固定顺序是:'Report','Article','Book',……
所以,我想要的是:无论'mylist'的初始顺序是什么,我都想重新排列它,让'Report'排在最前面,'Article'排在第二,等等……
我该怎么做才能根据我自己的顺序重新排列这个列表(取每个列表项的元组的第一个元素)呢?
回答:
我最后得到了这个结果:
mylist变成了一个字典的列表,像这样:
mylist = [{'id':'Article', "...some_data..."} ,
...etc
]
每个字典都有一个需要排序的'id'。
将正确的顺序保存在一个列表中:
correct_order = ['Report', 'Article', 'Book', ...]
然后执行:
results = sorted([item for item in results], cmp=lambda x,y:cmp(correct_order.index(x['id']), correct_order.index(y['id'])))
5 个回答
2
这种方法创建了一个字典,并按顺序从中提取项目。
mylist = [ ( u'Article', {"...some_data..."} ) ,
( u'Report' , {"...some_data..."} ) ,
( u'Book' , {"...another_data..."} ) ,
]
mydict = dict(mylist)
ordering = [u'Report', u'Article', u'Book']
print [(k,mydict[k]) for k in ordering]
这种方法使用排序,并且查找的速度是O(1),也就是非常快。
mylist = [ ( u'Article', {"...some_data..."} ) ,
( u'Report' , {"...some_data..."} ) ,
( u'Book' , {"...another_data..."} ) ,
]
mydict = dict(mylist)
ordering = dict((k,v) for v,k in enumerate([u'Report', u'Article', u'Book']))
print sorted(mydict.items(), key=lambda (k,v): ordering[k])
6
你可以使用字典,这样你就可以直接访问“书籍”、“文章”等内容,而不需要担心它们的顺序。我会把那个列表里的数据放进一个字典,像这样:
mydict = { u'Article': "somedata",
u'Report': "someotherdata", ...}
如果你真的想按照你描述的方式对列表进行排序,可以使用 list.sort
方法,并提供一个关键函数来表示你想要的排序方式(文档)。你需要这个关键函数,因为你只需要访问第一个元素,而且你的排序方式也不是按字母顺序的。
22
你可以使用一个字典,把每个第一个元素和它的“权重”对应起来,然后在排序的过程中查这个字典。
大概是这样的:
d = { "Report": 1,
"Article": 2,
"Book": 3 }
result = sorted(mylist, key=lambda x:d[x[0]])