-4

次の辞書の python リストがあるとします。

results = [[{'id': '001', 'result': [0,0,0,0,1]},
           {'id': '002', 'result': [1,1,1,1,1]},
           {'id': '003', 'result': [0,1,1,None,None]},
           {'id': '004', 'result': [0,None,None,1,0]},
           {'id': '005', 'result': [1,0,None,1,1]},
           {'id': '006', 'result': [0,0,0,1,1]}],
          [{'id': '001', 'result': [1,0,1,0,1]},
           {'id': '002', 'result': [1,1,1,1,1]},
           {'id': '003', 'result': [0,1,1,None,None]},
           {'id': '004', 'result': [0,None,None,1,0]},
           {'id': '005', 'result': [1,0,None,1,1]},
           {'id': '006', 'result': [1,0,1,0,1]}]
            ]

各グループのプレイヤー (「id」) 間の結果を比較し、一致するエントリの数に基づいてそれらを並べ替えることにより、「結果」の値に基づいて (python と golang の両方で) 新しい並べ替えられたリストを生成したいと思います ( None 結果は破棄され、カウントされません):

第 1 ラウンドと第 2 ラウンドで、001 と 006 には 9 つの一致する回答がありました:
001 = [0,0,0,0,1] 006 = [0,0,0,1,1] - 4 つの一致する回答。
2 回目のラウンドでは、001 と 006 に 5 つの一致する回答がありました:
001 = [1,0,1,0,1] 006 = [1,0,1,0,1] - 5 つの一致する回答

sorted_results = ['001','006','002','005','003','004']

'001' と '006' は、一致する結果の数が最も多い 9 個であるため、リストの最初の 2 つの項目です。

4

2 に答える 2

1

これらのアイテムを「同一結果の最大数」で並べ替えると、次のようになります。

['003', '004', '005', '006', '001', '002']

他のことを意味している場合 (つまり、「同一の結果の最大数」ではない場合)、質問を明確にしてください。max_identicalまた、同様の定義に従って機能するように関数を変更することもできます。

上記の結果は次のように計算されました。

from collections import defaultdict


results = [{'id': '001', 'result': [0, 0, 0, 0, 1]},
           {'id': '002', 'result': [1, 1, 1, 1, 1]},
           {'id': '003', 'result': [0, 1, 1, None, None]},
           {'id': '004', 'result': [0, None, None, 1, 0]},
           {'id': '005', 'result': [1, 0, None, 1, 1]},
           {'id': '006', 'result': [0, 0, 0, 1, 1]}]


def max_identical(lst):
    counts = defaultdict(lambda: 0)
    for x in lst:
        if x is not None:
            counts[x] += 1
    return max(counts.values())


results = sorted(results, key=lambda x: max_identical(x['result']))

print [x['id'] for x in results]
于 2013-10-01T14:40:45.073 に答える