Python:如何自定义列表?

Gab*_*ira 8 python sorting list

Obs:我知道python中的列表不是按顺序修复的,但认为这个列表是.我正在使用Python 2.4

我有一个列表,比如(例如)这个:

mylist = [ ( u'Article', {"...some_data..."}    ) ,
           ( u'Report' , {"...some_data..."}    ) ,
           ( u'Book'   , {"...another_data..."} ) ,
...#continue
]
Run Code Online (Sandbox Code Playgroud)

该变量mylist是从函数中获得的,返回列表的"顺序"会有所不同.所以,有时它就像在例子上.有时候,"报告"会出现在"文章"等之前.

我在此列表中有一个固定的订单(并不是按字母顺序排列).

让我们说我的固定顺序是:'报告','文章','书',......

所以,我想要的是:无论命令'mylist'被实例化,我都要重新排序,让'Report'保持在前面,'Article'在第二,等等......

使用我的"自定义"订单重新排序列表(使用列表中每个项目的元组的第一个元素)的最佳方法是什么?

答案:

我最终得到了这个:

mylist成了一个dicts列表,如下所示:

mylist = [{'id':'Article', "...some_data..."} ,
        ...etc
]
Run Code Online (Sandbox Code Playgroud)

每个dict都有一个必须排序的'id'.

在列表中保存正确的顺序在列表上分配correct_order:

correct_order = ['Report', 'Article', 'Book', ...]
Run Code Online (Sandbox Code Playgroud)

并做:

results = sorted([item for item in results], cmp=lambda x,y:cmp(correct_order.index(x['id']), correct_order.index(y['id'])))
Run Code Online (Sandbox Code Playgroud)

Jor*_*ril 16

您可以使用将每个第一个元素映射到其"权重"的字典,然后在排序函数中检查此字典.

就像是:

d = { "Report": 1,
      "Article": 2,
       "Book": 3 }
result = sorted(mylist, key=lambda x:d[x[0]])
Run Code Online (Sandbox Code Playgroud)

  • 最好使用一个键函数,而不是在Python 3中不再存在的已弃用的cmp函数:`sorted(mylist,key = lambda x:d [x [0]])` (11认同)
  • 您也可以使用这样写:`d = ["Report","Article","Book"]`然后`result = sorted(mylist,key = lambda x:d.index(x [0])` (3认同)
  • 它也推荐用于Python 2,因为使用键功能比cmp功能更快.请参见http://docs.python.org/library/functions.html#sorted (2认同)

Mad*_*ist 6

您可以使用字典,这样您就可以访问"Book","Article"等,而无需关心订单.我会把该列表中的数据放入一个如下所示的字典:

mydict = { u'Article': "somedata",
           u'Report': "someotherdata", ...}
Run Code Online (Sandbox Code Playgroud)

如果您真的想按照描述的方式对列表进行排序,可以使用list.sort带有表示特定排序顺序的键功能(文档).您需要键功能,因为您只需要访问第一个元素,排序顺序也不是按字母顺序排列的.

  • http://wiki.python.org/moin/HowTo/Sorting/再次,这个链接对这个问题最有帮助! (2认同)