2011-09-12 6 views
2

私は次のリストを持っている:パイソン - 注文ネストされたリストをアルファベットの方法で

["stephane", "philippe", "hélène", ["hugo", "jean-michel", "fernand"], "gustave"] 

そして、私はこのようにそれを注文したいと思います:

["gustave", "hélène", ["fernand", "hugo", "jean-michel"], "philippe", "stephane"] 

NB:以下のネストされたリストがある場合このリストはこのユーザーの右にある必要があります。

さらに、すべてのネストされたリストは同じように機能します。再帰的です。

答えて

2

d = { 
    "stephane": {}, 
    "philippe": {}, 
    "helene": { 
     "hugo": {}, 
     "jean-michel": {}, 
     "fernand": {}, 
    }, 
    "gustave": {}, 
} 

def sort_dict_as_list(d): 
    sorted_list = [] 
    for k, v in sorted(d.items()): 
     if k:  
      sorted_list.append(k) 
     if v: 
      sorted_list.append(v) 
    return sorted_list 

def sort_recursive(d): 
    if d: 
     for k, v in d.items(): 
      d[k] = sort_recursive(v) 
     return sort_dict_as_list(d) 
    else: 
     return d 

if __name__ == "__main__": 
    print sort_recursive(d) 

出力

python sortit.py 
['gustave', 'helene', ['fernand', 'hugo', 'jean-michel'], 'philippe', 'stephane'] 

私は徹底的にそれをテストしていませんが、それが出発点です。私はデータ構造としてリストを使ってそれを解決しようとしていましたが、再帰関数を入れ子にしてしまいました。それはあまりにも醜いものでした...ネッドの提案は本当に良かったです。

+0

OPにはすでにこれらのリストを消費する再帰的コードがいくつかあると思います。私はそれらをディクテーションのままにしておき、ソート順でそれらを消費します。ちょうど目的がちょうどかなりデバッグしている場合は、pprintモジュールはdictsを再帰的にソートします。 –

+0

ありがとう、私はそれをチェックします – wleao

6

あなたのデータは、それが辞書として表現されているように聞こえます。連続した要素が特別な関係を持つ音が奇妙なものをリストします。

あなたの代わりにこのようなあなたのデータを表す場合:

{ 
    "stephane": {}, 
    "philippe": {}, 
    "hélène": { 
    "hugo": {}, 
    "jean-michel": {}, 
    "fernand": {}, 
    }, 
    "gustave": {}, 
} 

を次に、あなたは、単にあなたが望む順序を取得するために辞書のキーを並べ替えることができますが。私はネッドの提案を使用して、この思い付いてきた

+0

Acti67が合理的に最近のPythonバージョンであれば、[OrderedDict'](http://docs.python.org/library/collections.html#collections .OrderedDict)。 –

+3

@Tim私はあなたが知っていると思いますが、そうでない人は、OrderedDictは_sorted_ではなく_ordered_です。並べ替えを行うには、キーと値のペアをソート順に追加する必要があります。 –

+0

+1いいえ、問題を解決する – wleao

関連する問題