2014-07-16 56 views
-1

解决这个问题有很多麻烦。我有一个列表清单。每个单独列表的第一个元素是一个名称。第二个元素是一个运动队(只是为了好玩)。在列表中找到元素的唯一组合

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

我基本上是试图找到两支球队每个人的独特组合 - 本质上,回答这个问题,哪两个队是个别球员中最常见的。所以对于布莱恩,有三支球队,可能的组合是'凯尔特人'''山猫'','''''''''''''','''''''''''''')。

一个输出,我可以使用,这是我一直在努力得到的,是这样的列表的另一个列表:

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

然而,我最希望的输出(最终产品)将被找到两支队伍的最高统计数字。在上面的例子中,会发生2次('bryan'和'david')的['celtics','wolves']

我试图编写for循环,但无法弄清楚。任何帮助将不胜感激。我不喜欢使用字典。

+4

_ “我宁愿不使用词典。” _ - 为什么? –

+0

所以,你把它分成2个子任务:1)按人分组,2)为每个分组生成一对。 – bereal

+0

我以前做过这个,你需要使用递归方法。你可以用一个列表来完成,一本字典确实让这个工作变得非常痛苦。我同意@ merlin2011,所以我不会给你我的代码。祝你好运! – Maximas

回答

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