问题描述
python 中是否有一种方法可以有效地在多个维度上进行条件迭代?考虑以下用例:
for i in range(N):
for j in range(i+1,N):
for k in range(N):
if (k != i) and (k != j):
print(i,j,k)
例如N = 4
这会产生
0 1 2
0 1 3
0 2 1
0 2 3
0 3 1
0 3 2
1 2 0
1 2 3
1 3 0
1 3 2
2 3 0
2 3 1
python 中是否有迭代器可以使用规则产生这个和类似的输出?我想象这样的事情
for i,k in fancy_iter(N=4,ndim=3,rules={'j > i','k != i','k != j'}):
print(i,k)
编辑:预计迭代器不会过度浪费周期。循环遍历所有参数组合,然后排除那些不符合条件的组合,在更高维度上可能会变得非常慢。
解决方法
您可以使用 itertools.product 然后按您的所有条件进行过滤。
而且,虽然可能不如 dict 输入那么好,但您可以使用已定义或 lambda 函数并将其传入。
类似于:
from itertools import product
def fancy_iter(N,ndim,rules):
ranges = [range(N)] * ndim
for i,j,k in product(*ranges):
if rules(i,k):
yield i,k
def my_rules(i,k):
return j > i and k != i and k != j
def main():
for i,k in fancy_iter(4,3,my_rules):
print(i,k)
if __name__ == '__main__':
main()
输出:
0 1 2
0 1 3
0 2 1
0 2 3
0 3 1
0 3 2
1 2 0
1 2 3
1 3 0
1 3 2
2 3 0
2 3 1