2017-11-24 12 views
1

私を助けてください。私が降順にコミット数に基づいてデータセットを並べ替えるとPythonを使ってプロジェクトの名前を無視することによって、新しいリストにそれを作るために必要どのようにPythonで辞書の辞書の辞書のデータを並べ替えるには?

my_dict = { 'project_1' : [{'commit_number':'14','name':'john'}, 
          {'commit_number':'10','name':'steve'}], 
      'project_2' : [{'commit_number':'12','name':'jack'}, 
          {'commit_number':'15','name':'anna'}, 
          {'commit_number':'11','name':'andy'}] 
      } 

:私はこのようなデータセットを持っています。期待されるリストは次のようになります:

ordered_list_of_dict = [{'commit_number':'15','name':'anna'}, 
         {'commit_number':'14','name':'john'}, 
         {'commit_number':'12','name':'jack'}, 
         {'commit_number':'11','name':'andy'}, 
         {'commit_number':'10','name':'steve'}] 

ありがとうございました。リストのリストとして

答えて

3
  1. 抽出my_dict「の値は、
  2. 一緒に各サブリストに参加commit_number

によって

  • ソートをフラットリストに各要素を形成する(dict_valuesを平坦化)* * python2のリストのリストpython3では、dict_valuesオブジェクトが返されます。 python2で


    from itertools import chain 
    
    sorted(
        chain.from_iterable(my_dict.values()), key=lambda x: x['commit_number'], reverse=True 
    ) 
    
    [{'commit_number': '15', 'name': 'anna'}, 
    {'commit_number': '14', 'name': 'john'}, 
    {'commit_number': '12', 'name': 'jack'}, 
    {'commit_number': '11', 'name': 'andy'}, 
    {'commit_number': '10', 'name': 'steve'}] 
    

    、あなたは同じ効果にdict.itervaluesの代わりdict.valuesを使用すると思います。

  • 1

    Coldspeedの答えはいつものように素晴らしいですが、代替手段として、次を使用することができます。

    印刷したとき、与え、
    ordered_list_of_dict = sorted([x for y in my_dict.values() for x in y], key=lambda x: x['commit_number'], reverse=True) 
    

    print(ordered_list_of_dict) 
    # [{'commit_number': '15', 'name': 'anna'}, {'commit_number': '14', 'name': 'john'}, {'commit_number': '12', 'name': 'jack'}, {'commit_number': '11', 'name': 'andy'}, {'commit_number': '10', 'name': 'steve'}] 
    

    注意list-comprehensionであなたが持っていますリストのリストを平滑化するための標準構造

    [x for sublist in big_list for x in sublist]

    0

    私はあまりpyononicでなく、読者にやさしい答えを提供します。

    まず、my_dictにキーと値のペアを反復し、空のリストに値の各要素を追加します。これが基づいて分類されます

    sorted(commits, reverse = True) 
    

    :次に

    In [121]: commits 
    Out[121]: 
    [{'commit_number': '12', 'name': 'jack'}, 
    {'commit_number': '15', 'name': 'anna'}, 
    {'commit_number': '11', 'name': 'andy'}, 
    {'commit_number': '14', 'name': 'john'}, 
    {'commit_number': '10', 'name': 'steve'}] 
    

    降順で並べ替える:これは与え

    commits = [] 
    for key, val in my_dict.items(): 
        for commit in val: 
         commits.append(commit) 
    

    :あなたが持っ避けるこの方法は、リストのリストを平らにアルファベット順に 'name'の前に来るので、指定しなくても 'commit_number'。 defensive codingのためにそれを指定したい場合は、私の知識の範囲内で、これは最速でクリーンな方法です。

    from operator import itemgetter 
    sorted(commits, key = itemgetter('commit_number'), reverse = True) 
    
    関連する問題