我有问题。我有一个字典列表,我将其排序如下:
the_list = [
{'name': 'bobby', 'sport_type': 'football'},
{'name': 'jenny', 'sport_type': 'football'},
{'name': 'karl', 'sport_type': 'football'},
{'name': 'bobby', 'sport_type': 'hokey'},
{'name': 'jenny', 'sport_type': 'hokey'},
{'name': 'karl', 'sport_type': 'hokey'},
{'name': 'bobby', 'sport_type': 'tennis'},
{'name': 'jenny', 'sport_type': 'tennis'},
{'name': 'karl', 'sport_type': 'tennis'},
]
列表的长度为n,因此将有更多具有不同名称键和sport_type键的字典。我需要基于相同的sport_type和!=不同的名称创建一个独特的字典对列表。像这样:
need_to = [
[{'name': 'bobby', 'sport_type': 'football'},{'name': 'jenny', 'sport_type': 'football'}],
[{'name': 'jenny', 'sport_type': 'football'},{'name': 'karl', 'sport_type': 'football'}],
[{'name': 'bobby', 'sport_type': 'football'},{'name': 'karl', 'sport_type': 'football'}],
[{'name': 'bobby', 'sport_type': 'hokey'},{'name': 'jenny', 'sport_type': 'hokey'}],
[{'name': 'jenny', 'sport_type': 'hokey'},{'name': 'karl', 'sport_type': 'hokey'}],
[{'name': 'bobby', 'sport_type': 'hokey'},{'name': 'karl', 'sport_type': 'hokey''}],
[{'name': 'bobby', 'sport_type': 'tennis'},{'name': 'jenny', 'sport_type': 'tennis'}],
[{'name': 'jenny', 'sport_type': 'tennis'},{'name': 'karl', 'sport_type': 'tennis'}],
[{'name': 'bobby', 'sport_type': 'tennis'},{'name': 'karl', 'sport_type': 'tennis'}],
]
因此,没有反向重复a + b,b + a。我怎么做?
答案 0 :(得分:2)
您可以为此使用itertools.combinations。
>>> import itertools
>>> [c for c in itertools.combinations(the_list, 2) if c[0]['sport_type'] == c[1]['sport_type']]
[({'name': 'bobby', 'sport_type': 'football'},{'name': 'jenny', 'sport_type': 'football'}),
({'name': 'bobby', 'sport_type': 'football'},{'name': 'karl', 'sport_type': 'football'}),
({'name': 'jenny', 'sport_type': 'football'},{'name': 'karl', 'sport_type': 'football'}),
({'name': 'bobby', 'sport_type': 'hokey'},{'name': 'jenny', 'sport_type': 'hokey'}),
({'name': 'bobby', 'sport_type': 'hokey'},{'name': 'karl', 'sport_type': 'hokey'}),
({'name': 'jenny', 'sport_type': 'hokey'},{'name': 'karl', 'sport_type': 'hokey'}),
({'name': 'bobby', 'sport_type': 'tennis'},{'name': 'jenny', 'sport_type': 'tennis'}),
({'name': 'bobby', 'sport_type': 'tennis'},{'name': 'karl', 'sport_type': 'tennis'}),
({'name': 'jenny', 'sport_type': 'tennis'},{'name': 'karl', 'sport_type': 'tennis'})]
答案 1 :(得分:1)
首先按sport_type
分组(使用字典),然后使用itertools.combinations:
from itertools import combinations
the_list = [
{'name': 'bobby', 'sport_type': 'football'},
{'name': 'jenny', 'sport_type': 'football'},
{'name': 'karl', 'sport_type': 'football'},
{'name': 'bobby', 'sport_type': 'hokey'},
{'name': 'jenny', 'sport_type': 'hokey'},
{'name': 'karl', 'sport_type': 'hokey'},
{'name': 'bobby', 'sport_type': 'tennis'},
{'name': 'jenny', 'sport_type': 'tennis'},
{'name': 'karl', 'sport_type': 'tennis'},
]
groups = {}
for d in the_list:
groups.setdefault(d['sport_type'], []).append(d)
result = [list(pair) for group in groups.values() for pair in combinations(group, 2)]
for pair in result:
print(pair)