2014-07-16 88 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