0

pathおよびtype(タイプ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}]

最初に並べ替えてから並べ替えたいので、次pathtypeようになります

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と、その下にリストされているdirs内のdirsとファイルの素晴らしいリストが表示されます。

ありがとう

4

2 に答える 2

2

実際にソートしたいものだけをキーに含める必要があります。パス内の最後のスラッシュで区切られたセグメントの後のすべての優先順位を下げたいように見えるので、それを削除するか、ソート順で後で移動する必要があります。

everything.sort(key=lambda x: (
    '/'.join(x['path'].split('/')[:-1]),
    x['type'],
    ''.join(x['path'].split('/')[-1:]),
  )
)
于 2012-12-29T01:38:48.453 に答える
0

あなたのソート基準は非常に難解なので、比較関数を書くことによってのみこれを行うことができると思います.

于 2012-12-29T01:40:53.333 に答える