在列表中找到元素的唯一组合
我在弄清楚这个问题时遇到了很多麻烦。我有一个列表,里面又包含了很多小列表。每个小列表的第一个元素是一个名字,第二个元素是一个运动队(只是为了好玩)。
[['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