繁体   English   中英

根据条件从字典列表中制作唯一的字典对

[英]Make unique pairs of dicts from a list of dicts based on conditions

我有一个字典列表,我是这样排序的:

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 个长度,因此会有更多具有不同名称键和运动类型键的字典。 我需要基于相同的运动类型和 != 不同的名称创建一个唯一的字典对列表。 像这样:

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。 我怎么做?

您可以为此使用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'})]

首先按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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM