2012-12-29 45 views
0

我有有pathtype的键(类型0 =>文件和类型1 =>目录)初始看起来像这样蟒列表排序多个键

everything = [{u'path': u'/1/', u'type': 1}, 
    {u'path': u'/2/', u'type': 1}, 
    {u'path': u'/3/', u'type': 1}, 
    {u'path': u'/1/something/a.py', u'type': 0}, 
    {u'path': u'/1/something/b.py', u'type': 0}, 
    {u'path': u'/1/something/c.py', u'type': 0}, 
    {u'path': u'/1/foobar/', u'type': 1}, 
    {u'path': u'/2/baz/', u'type': 1}, 
    {u'path': u'/1/something/baz/snap/pop/a.py', u'type': 0}, 
    {u'path': u'/1/something/baz', u'type': 1}] 

欲词典列表在path第一个排序,然后关闭的type所以我得到这样的

everything = [{u'path': u'/1/', u'type': 1}, 
    {u'path': u'/1/foobar/', u'type': 1}, 
    {u'path': u'/1/something/baz', u'type': 1}, # < --- I want this here 
    {u'path': u'/1/something/a.py', u'type': 0}, 
    {u'path': u'/1/something/b.py', u'type': 0}, 
    {u'path': u'/1/something/baz/snap/pop/a.py', u'type': 0}, 
    {u'path': u'/1/something/c.py', u'type': 0}, 
    {u'path': u'/2/', u'type': 1}, 
    {u'path': u'/2/baz/', u'type': 1}, 
    {u'path': u'/3/', u'type': 1}] 

里的“东西”部分类型开始1

我想,当我做

everything.sort(key=lambda x: (x['path'], x['type'])) 

我会得到我想要的东西,但我得到

everything = [{u'path': u'/1/', u'type': 1}, 
    {u'path': u'/1/foobar/', u'type': 1}, 
    {u'path': u'/1/something/a.py', u'type': 0}, 
    {u'path': u'/1/something/b.py', u'type': 0}, 
    {u'path': u'/1/something/baz', u'type': 1}, # < --- I don't want this here 
    {u'path': u'/1/something/baz/snap/pop/a.py', u'type': 0}, 
    {u'path': u'/1/something/c.py', u'type': 0}, 
    {u'path': u'/2/', u'type': 1}, 
    {u'path': u'/2/baz/', u'type': 1}, 
    {u'path': u'/3/', u'type': 1}] 

有一种简单的方法来排序,以这种方式everything还是我写我自己分类?

编辑:

也许这将有助于解释我想要的。

在linux下当你做一个ls -lR你迪尔斯和文件在其下所列的迪尔斯的一个很好的列表。

谢谢

+0

http://wiki.python.org/moin/HowTo/Sorting/ – 2012-12-29 01:23:19

+0

可能重复[Python多字键排序字典列表](http://stackoverflow.com/questions/1143671/python-sorting- – miku

+0

@miku列表的-字典按多重键),我看到了,但这并不做我想做的事情。这就是我在帖子中关键的那种。 – Jeff

回答

2

你只需要在关键字中包含你真正想要排序的内容。既然你似乎要在路径中的最后一个斜杠分隔段后,以减少一切的优先级,你应该删除或更新版本中的排序顺序移动它:

everything.sort(key=lambda x: (
    '/'.join(x['path'].split('/')[:-1]), 
    x['type'], 
    ''.join(x['path'].split('/')[-1:]), 
) 
) 
+0

正是我所期待的。谢谢。 – Jeff