在列表中找到元素的唯一组合

-1 投票
1 回答
754 浏览
提问于 2025-04-18 13:30

我在弄清楚这个问题时遇到了很多麻烦。我有一个列表,里面又包含了很多小列表。每个小列表的第一个元素是一个名字,第二个元素是一个运动队(只是为了好玩)。

[['bryan', 'celtics'],
 ['bryan', 'bobcats'],
 ['bryan', 'wolves'],
 ['steve', 'celtics'],
 ['steve', 'kings'],
 ['steve', 'hawks'],
 ['david', 'celtics'],
 ['david', 'wolves']
 ['david', 'heat']]

我其实是想找出每个人的两个运动队的独特组合,简单来说,就是想知道哪些运动队在个人玩家中最常见。所以对于bryan来说,他有三个运动队,可能的组合是['celtics', 'bobcats']、['bobcats', 'wolves']和['celtics', 'wolves']。

我想要的一个输出结果是另一个列表,里面也包含小列表,像这样:

[['celtics', 'bobcats'],
['bobcats', 'wolves'],
['celtics', 'wolves'],
['celtics', 'kings'],
['celtics', 'hawks'],
['kings', 'hawks'],
['celtics', 'wolves'],
['celtics', 'heat'],
['wolves', 'heat']]

不过,我最想要的结果是找出出现次数最多的两个运动队。在上面的例子中,就是['celtics', 'wolves'],它出现了2次(分别是'bryan'和'david')。

我试着写了一个for循环,但就是搞不定。如果能得到一些帮助,我会非常感激。我更希望不使用字典。

1 个回答

0

这个过程分为两个步骤:

1) 首先,根据名字把条目分组。在这里,collection.defaultdict 非常有用:

from collections import defaultdict
by_name = defaultdict(list)    # create empty lists automatically
for name, team in teams:
    by_name[name].append(team)

2) 然后,利用 itertools.combinations 从这些分组中生成配对:

from itertools import combinations

for group in by_name.items():
    for pair in combinations(group, 2):
        yield pair  # list(pair) if you need lists

撰写回答