我试图牢牢掌握迭代词典,特别是当值不等长时(这对我来说造成的错误最多)。我实际上是想为我的篮球计划运行一个脚本来寻找对子。这是团队的一小部分:
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在列表中的价值没有任何共同之处。其他两个相同。非常有兴趣看到解决问题的方法。
答案 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)
,如果您了解生成器。
希望这足以让你自己写下来。