Python:如何自定义排序列表?

10 投票
5 回答
21223 浏览
提问于 2025-04-16 03:37

注意:我知道在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]])

撰写回答