2014-07-23 33 views
0

我試圖通過字典,尤其是當值的長度不等時(這對我造成最大的錯誤)得到一個迭代的牢固把握。我實際上正在爲我的籃球程序運行一個腳本來尋找對。這裏是球隊的一個片段:在字典中創建對的唯一值python

team = {'Bryan': ['m', 'pg','sg','sf'], 'Steve': ['m', 'pg','sf','c'], 'Suzy': ['f,','c','pf'], 'Jen': ['f','pf']} 

基本上,我建立了我的字典,這樣,如果沒有密鑰具有列表中任何共同的價值觀,他們是一對。

,我一直在努力得到的輸出是:在列表中

[('Suzy','Bryan'), ('Jen','Bryan'), ('Jen','Steve')] 

所以蘇茜和Bryan的價值觀沒有任何共同之處。其他兩個也一樣。非常有興趣看到解決問題的方法。

+0

到目前爲止您嘗試了哪些方法? –

+0

「值不等長」與遍歷字典毫無關係。在字典中,每個值都只是一個值;事實上,它恰好是一個列表或字符串或任何長度不影響任何東西。 – abarnert

回答

2
import itertools 
def find_matches(team): 
    for player1,player2 in itertools.combinations(team.keys(),2): 
     if not set(team[player1]).intersection(team[player2]): 
      yield (player1,player2) 

team = {'Bryan': ['m', 'pg','sg','sf'], 'Steve': ['m', 'pg','sf','c'], 'Suzy': ['f,','c','pf'], 'Jen': ['f','pf']}   
print list(find_matches(team)) 

可能是我會怎麼做?

1

這僅僅是一個循環的物質循環中的:

for each player 
    for each other player 
     if no value in player's values is in other player's values, add the pair 

最後一行中有一個隱含的循環中,當然(實際上,兩個,因爲列表中的「進入」本身有一個循環,但讓我們忘了那個,因爲它只是一個小問題,而不是概念問題)。

如果你想在第三循環明確:

for each player 
    for each other player 
     for each value in player's values 
      if value in other player's values, break 
     else add the pair 

那麼,如何您翻譯到Python?

那麼,「對於每個玩家」只是for player in team-或for player, values in team.items()可能會爲您節省一些工作。

然後「對於其他玩家」又是一回事。 (當然,這意味着「玩家」可以作爲「其他玩家」來比較,這是不必要的 - 但它不會損害任何東西,除非比較某人和他自己的較小的性能成本,這會在第一次失敗檢查。)

然後「如果玩家的價值中沒有任何價值是其他玩家的價值」只是if not any(value in other_values for value in player_values)。您可以通過將other_values轉換爲一個集合來加快速度,但可能沒有必要考慮列表的長度有多短。

最後,如果您瞭解生成器,則「添加對」僅表示pairs.append((player, other))yield (player, other)

希望這足以讓你自己寫。

+0

+1實際幫助他學習(像往常一樣:P) –