从字典python中的唯一值创建对

时间:2014-07-23 22:32:47

标签: python dictionary

我试图牢牢掌握迭代词典,特别是当值不等长时(这对我来说造成的错误最多)。我实际上是想为我的篮球计划运行一个脚本来寻找对子。这是团队的一小部分:

team = {'Bryan': ['m', 'pg','sg','sf'], 'Steve': ['m', 'pg','sf','c'], 'Suzy': ['f,','c','pf'], 'Jen': ['f','pf']}
基本上,我设置了我的词典,这样如果列表中没有任何键有任何共同的值,它们就是一对。

我一直试图获得的输出是:

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

所以Suzy和Bryan在列表中的价值没有任何共同之处。其他两个相同。非常有兴趣看到解决问题的方法。

2 个答案:

答案 0 :(得分: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 :(得分:1)

这实际上只是循环中循环的问题:

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

最后一行有一个隐式循环,当然(实际上,两个,因为列表中的“in in”本身有一个循环,但是让我们忘记那个,因为它只是一个小的性能问题,而不是概念性问题)。

如果你想明确第三个循环:

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),如果您了解生成器。

希望这足以让你自己写下来。