我无法理解 Python 中的递归或迭代动态循环
I can't understand recursive or iterative dynamic loops in Python
昨天给大家讲了动态循环的方法,大家回答的不是recursion就是iter,老实说我还没看懂。所以我今天要说得更具体一些。
比如说,用户被问到字段数,他选择了3。
因此,对于数组或带键的字典,例如 var
,将有一个循环,用 3 个条目填充它们。
我想要的是使嵌套循环在伪代码中表现得像
for i in var[0]:
for j in var[1]:
for k in var[2]:
print(i, j, k)
这样,如果原始列表有
var[0] = "hello", "world"
var[1] = "I", "like"
var[2] = "coding", "Python"
然后打印会显示:
loop 1) hello, I, coding, python,
loop 2) hello, like, coding, python,
loop 3) world, I, coding, python
loop 4) world, like, coding, python
问题是,使用静态循环很容易做到这一点,但整个代码取决于用户输入的值。在这种情况下,将有 4 个嵌套循环。
所以我在想,这可能吗,递归或 iter 等?
如果是,请给我一天中的时间来解释如何?有示例代码吗?
谢谢...
如果我理解你的需求正确,你可以使用itertools.product
从每个列表中生成变量的组合,使用变量来控制使用的var
元素的数量。例如:
import itertools
var = [["hello", "world"],
["I", "like"],
["coding", "Python"]
]
for fields in 2, 3:
print(f"fields = {fields}\n")
for values in itertools.product(*var[:fields]):
print(values)
print()
输出:
fields = 2
('hello', 'I')
('hello', 'like')
('world', 'I')
('world', 'like')
fields = 3
('hello', 'I', 'coding')
('hello', 'I', 'Python')
('hello', 'like', 'coding')
('hello', 'like', 'Python')
('world', 'I', 'coding')
('world', 'I', 'Python')
('world', 'like', 'coding')
('world', 'like', 'Python')
或者,您可以使用递归,为对操作它们的函数的每次调用构建一个值列表:
def doit(values):
print(values)
def loop(fields, args, values=[]):
if fields == 0:
doit(values)
else:
for v in args[0]:
loop(fields-1, args[1:], values + [v])
var = [["hello", "world"],
["I", "like"],
["coding", "Python"]
]
loop(2, var)
loop(3, var)
输出:
['hello', 'I']
['hello', 'like']
['world', 'I']
['world', 'like']
['hello', 'I', 'coding']
['hello', 'I', 'Python']
['hello', 'like', 'coding']
['hello', 'like', 'Python']
['world', 'I', 'coding']
['world', 'I', 'Python']
['world', 'like', 'coding']
['world', 'like', 'Python']
昨天给大家讲了动态循环的方法,大家回答的不是recursion就是iter,老实说我还没看懂。所以我今天要说得更具体一些。
比如说,用户被问到字段数,他选择了3。
因此,对于数组或带键的字典,例如 var
,将有一个循环,用 3 个条目填充它们。
我想要的是使嵌套循环在伪代码中表现得像
for i in var[0]:
for j in var[1]:
for k in var[2]:
print(i, j, k)
这样,如果原始列表有
var[0] = "hello", "world"
var[1] = "I", "like"
var[2] = "coding", "Python"
然后打印会显示:
loop 1) hello, I, coding, python,
loop 2) hello, like, coding, python,
loop 3) world, I, coding, python
loop 4) world, like, coding, python
问题是,使用静态循环很容易做到这一点,但整个代码取决于用户输入的值。在这种情况下,将有 4 个嵌套循环。
所以我在想,这可能吗,递归或 iter 等? 如果是,请给我一天中的时间来解释如何?有示例代码吗? 谢谢...
如果我理解你的需求正确,你可以使用itertools.product
从每个列表中生成变量的组合,使用变量来控制使用的var
元素的数量。例如:
import itertools
var = [["hello", "world"],
["I", "like"],
["coding", "Python"]
]
for fields in 2, 3:
print(f"fields = {fields}\n")
for values in itertools.product(*var[:fields]):
print(values)
print()
输出:
fields = 2
('hello', 'I')
('hello', 'like')
('world', 'I')
('world', 'like')
fields = 3
('hello', 'I', 'coding')
('hello', 'I', 'Python')
('hello', 'like', 'coding')
('hello', 'like', 'Python')
('world', 'I', 'coding')
('world', 'I', 'Python')
('world', 'like', 'coding')
('world', 'like', 'Python')
或者,您可以使用递归,为对操作它们的函数的每次调用构建一个值列表:
def doit(values):
print(values)
def loop(fields, args, values=[]):
if fields == 0:
doit(values)
else:
for v in args[0]:
loop(fields-1, args[1:], values + [v])
var = [["hello", "world"],
["I", "like"],
["coding", "Python"]
]
loop(2, var)
loop(3, var)
输出:
['hello', 'I']
['hello', 'like']
['world', 'I']
['world', 'like']
['hello', 'I', 'coding']
['hello', 'I', 'Python']
['hello', 'like', 'coding']
['hello', 'like', 'Python']
['world', 'I', 'coding']
['world', 'I', 'Python']
['world', 'like', 'coding']
['world', 'like', 'Python']