-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]}]
            ]

我想根据'result'的值生成一个新的排序列表(在python和golang中),方法是比较每个组中玩家('id')之间的结果,然后根据匹配条目的数量对它们进行排序(没有结果被丢弃且不计算在内):

在第一轮和第二轮中,001 和 006 有九个匹配的答案:
001 = [0,0,0,0,1] 006 = [0,0,0,1,1] - 四个匹配的答案。
在第二轮中,001 和 006 有五个匹配的答案:
001 = [1,0,1,0,1] 006 = [1,0,1,0,1] - 五个匹配的答案

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

'001' 和 '006' 是列表中的前两项,因为它们的匹配结果数量最多 - 九个。

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 回答
0

寻找与您的问题非常相似的问题的解决方案我发现了这个页面: http ://w3facility.org/question/sorting-a-python-dictionary-after-running-an-itertools-function/

使用您的示例:

import itertools
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 的比较,每个用于每一轮。

similarity = {}
for p1, p2 in itertools.combinations(results[0], 2):
    similarity.setdefault((p1["id"], p2["id"]), sum([1 for i in range(len(p1["result"])) if p1["result"][i] == p2["result"][i]]))
for p1, p2 in itertools.combinations(results[1], 2):
    similarity.setdefault((p1["id"], p2["id"]), 0)
    similarity[(p1["id"], p2["id"])] += sum([1 for i in range(len(p1["result"])) if p1["result"][i] == p2["result"][i]])

现在通过匹配值对 id 对进行排序,将返回一个有序的 id 元组列表。

similarity = sorted(similarity, key=lambda x:similarity[x], reverse=True)
print(similarity)

现在要消除重复值,只需按顺序保留每个 id 的第一次出现并忘记其余的。

sorted_ids = []
for tuple_id in similarity:
    if tuple_id[0] not in sorted_ids:
        sorted_ids.append(tuple_id[0])
    if tuple_id[1] not in sorted_ids:
        sorted_ids.append(tuple_id[1])

print sorted_ids
于 2015-08-04T19:14:29.643 回答