python - Python N 嵌套循环
问题描述
所以这是我想做的一个例子。
def multi_range(range_func):
for a in range_func():
for b in range_func():
yield a, b
但是,我真正想要的是适用于 N 循环的东西。我会想这样的事情。
def multi_range(range_func, N, sofar=None, results=None):
if sofar is None:
sofar = []
if results is None:
results = []
for a in range_func():
if N == 1:
results.append(sofar + [a])
else:
multi_range(range_func, N - 1, sofar + [a], results)
return results
def test_range():
yield 0
yield 1
for b in multi_range(test_range, 3):
print(b)
这会正确输出以下内容。
[0, 0, 0]
[0, 0, 1]
[0, 1, 0]
[0, 1, 1]
[1, 0, 0]
[1, 0, 1]
[1, 1, 0]
[1, 1, 1]
这里的问题是它必须创建整个列表并将其存储在内存中。例如,如果使用 test_range 代替,则会消耗大量内存。
def test_range():
for x in range(10000):
yield x
(是的,我知道有一个与 range 行为相同的 range 包装器很奇怪。这只是一个例子)
那是我的问题。如何在不将所有结果存储在列表中的情况下编写一个行为类似于此的函数?
解决方案
>>> from itertools import product
>>> def test_range():
... yield 0
... yield 1
...
>>> for b in product(test_range(), repeat=3):
... print(b)
...
(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)
如果您好奇这是如何实现的,请参阅链接文档中的示例实现。
推荐阅读
- ios - 火力基地。更改签名后不会生成令牌(从个人签名到开发人员签名)
- python - 在什么情况下你应该在 python 中实际使用生成器?
- c# - 配置文件页面抛出 HTTP 500 错误
- html - ng 类的字体真棒行为
- python - Kivy - 如何设置一段代码的持续时间?
- vhdl - VHDL - 行为正常工作,发布路线有问题
- java - java rest用json向邮递员返回响应-语法错误:意外的'S'
- python - Python:pivot_table 和 groupby 得到完全相反的结果
- java - 在 Ubuntu 中构建 APK 反应本机应用程序的问题
- elixir - 修改连接表以引用不同的表并重命名