使用字典避免重复的双循环



考虑以下代码片段:

foo = {'a': 0, 'b': 1, 'c': 2}
for k1 in foo:
for k2 in foo:
print(foo[k1], foo[k2])

输出将是

0 0
0 1
0 2
1 0
1 1 
1 2
2 0
2 1 
2 2

我不关心键对的顺序,所以我想要输出

的代码
0 0
0 1
0 2
1 1 
1 2
2 2

I tried with

foo = {'a': 0, 'b': 1, 'c': 2}
foo_2 = foo.copy()
for k1 in foo_2:
for k2 in foo_2:
print(foo[k1], foo[k2])
foo_2.pop(k1)

但我显然得到了

RuntimeError: dictionary changed size during iteration

其他解决方案?

foo = {'a': 0, 'b': 1, 'c': 2}
foo_2 = foo.copy()
for k1 in foo:
for k2 in foo_2:
print(foo[k1], foo[k2])
foo_2.pop(k1)

您在foo_2中循环两次,当您试图从foo_2中弹出k1时,它会在循环时改变字典,从而导致错误,因此通过首先循环foo,您可以避免错误。

>>> foo = {'a': 0, 'b': 1, 'c': 2}
>>> keys = list(foo.keys())
>>> for i, v in enumerate(keys):
...     for j, v2 in enumerate(keys[i:]):
...             print(foo[v], foo[v2])
... 
0 0
0 1
0 2
1 1
1 2
2 2

一个基本的方法。

foo = {'a': 0, 'b': 1, 'c': 2}
for v1 in foo.values():
for v2 in foo.values():
if v1 <= v2:
print(v1, v2)

itertools.combinations_with_replacement也可以这样做:

from itertools import combinations_with_replacement
foo = {'a': 0, 'b': 1, 'c': 2}
print(*[f'{foo[k1]} {foo[k2]}' for k1, k2 in combinations_with_replacement(foo.keys(), r=2)], sep='n')

你可以直接传递foo的值字典转换为列表和循环。

foo = {'a': 0, 'b': 1, 'c': 2}
val_list = list(foo.values())
for k1 in foo.values():
for row in val_list:
print(k1, row)
val_list.pop(0)

相关内容

  • 没有找到相关文章

最新更新