【问题标题】:Make unique pairs of dicts from a list of dicts based on conditions根据条件从字典列表中制作唯一的字典对
【发布时间】:2019-11-27 11:52:43
【问题描述】:

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

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,因此会有更多具有不同 name 键和 sport_type 键的 dicts。我需要基于相同的 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。我怎么做?

【问题讨论】:

    标签: python list sorting dictionary combinations


    【解决方案1】:

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

    【讨论】:

    • 哇,这正是我需要的!非常感谢!
    【解决方案2】:

    第一组由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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      相关资源
      最近更新 更多