Python 如何定义涉及for循环的迭代函数,其中迭代器i,j,l。。也用于定义的迭代函数中
我正在尝试使用递归函数来简化下面的“for循环”,用于根据需要运行程序的任意数量的循环。我可以定义一个递归函数,而不需要使用I,j,k,l。。。。在函数中,但我不知道或者我很难用I,j,k定义一个迭代函数。。。 如果有人能帮我想象一下,我会很高兴的Python 如何定义涉及for循环的迭代函数,其中迭代器i,j,l。。也用于定义的迭代函数中,python,list,function,loops,iterator,Python,List,Function,Loops,Iterator,我正在尝试使用递归函数来简化下面的“for循环”,用于根据需要运行程序的任意数量的循环。我可以定义一个递归函数,而不需要使用I,j,k,l。。。。在函数中,但我不知道或者我很难用I,j,k定义一个迭代函数。。。 如果有人能帮我想象一下,我会很高兴的 adjcent_spin_product_matrix = [] z_partial = 0 spin = [-1, 1] for i in spin: for j in spin: for k in spin:
adjcent_spin_product_matrix = []
z_partial = 0
spin = [-1, 1]
for i in spin:
for j in spin:
for k in spin:
for l in spin:
for m in spin:
for o in spin:
for p in spin:
adjcent_spin_product_matrix = adjcent_spin_product_matrix + [i*j+ j*k+ k*l+ l*n+ m*o+ o*p]
如果您不想使用递归函数来实现这一点,那么可以使用递归函数。将循环的每个级别推送到堆栈中,以便以后可以将其弹出
堆栈是大多数语言中的基本数据结构,因为它是存储函数调用上下文的一种非常自然的方式,也是堆栈溢出的由来。如果您不想使用递归函数来实现这一点,可以使用。将循环的每个级别推送到堆栈中,以便以后可以将其弹出
在大多数语言中,堆栈是一种基本的数据结构,因为它是存储函数调用上下文的一种非常自然的方式,也是堆栈溢出的由来。我先前的回答是反对您未经编辑的帖子的,所以这里有一个更新: 从您提供的代码可以清楚地看出,您必须至少有
i
和j
的循环
单独评估该循环会得到以下列表:
[1,-1,-1,1]
现在,编码中的每个后续嵌套循环仅复制此列表中的每个元素,然后添加上一个循环中的数组(重复两次): i、j和k循环给出
[1,1,-1,-1,-1,-1,1]+[1,-1,-1,
1,1,-1,-1,1]=[2,0,-2,0,0,-2,0,2]
i、j、k和l循环给出[1,1,1,1,1,-1,-1,-1,-1,-1,1,1]+[1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1]=[3,1,1,1,-1,1,-1,1,-1,-1,-1]
等等
因此,您可以简单地尝试以下方法:
adjacent_spin_product_matrix = []
ij_result = [1, -1, -1, 1]
def calc_product(adjacent_spin_product_matrix, number_of_indices):
if number_of_indices == 2:
return ij_result
else:
number_of_duplicates = 2 ** (number_of_indices - 2)
curr_array = []
for elem in ij_result:
for dup in range(number_of_duplicates):
curr_array.append(elem)
prev_array = calc_product(adjacent_spin_product_matrix, number_of_indices - 1)
temp_array = []
temp_array.extend(prev_array)
temp_array.extend(prev_array)
result = []
for i, elem in enumerate(curr_array):
result.append(elem + temp_array[i])
return result
现在,你应该发现:
print(calc_product([], 2)) # equivalent to i and j case
print(calc_product([], 3)) # equivalent to i, j, and k case
print(calc_product([], 4)) # equivalent to i, j, k, and l case
print(calc_product([], 5)) # equivalent to i, j, k, l, and m case
print(calc_product([], 6)) # equivalent to i, j, k, l, m, and o case
print(calc_product([], 7)) # equivalent to i, j, k, l, m, o, and p case
这些都给出了预期的结果:
[1, -1, -1, 1]
[2, 0, -2, 0, 0, -2, 0, 2]
[3, 1, -1, 1, -1, -3, -1, 1, 1, -1, -3, -1, 1, -1, 1, 3]
[4, 2, 0, 2, 0, -2, 0, 2, 0, -2, -4, -2, 0, -2, 0, 2, 2, 0, -2, 0, -2, -4, -2, 0, 2, 0, -2, 0, 2, 0, 2, 4]
[5, 3, 1, 3, 1, -1, 1, 3, 1, -1, -3, -1, 1, -1, 1, 3, 1, -1, -3, -1, -3, -5, -3, -1, 1, -1, -3, -1, 1, -1, 1, 3, 3, 1, -1, 1, -1, -3, -1, 1, -1, -3, -5, -3, -1, -3, -1, 1, 3, 1, -1, 1, -1, -3, -1, 1, 3, 1, -1, 1, 3, 1, 3, 5]
[6, 4, 2, 4, 2, 0, 2, 4, 2, 0, -2, 0, 2, 0, 2, 4, 2, 0, -2, 0, -2, -4, -2, 0, 2, 0, -2, 0, 2, 0, 2, 4, 2, 0, -2, 0, -2, -4, -2, 0, -2, -4, -6, -4, -2, -4, -2, 0, 2, 0, -2, 0, -2, -4, -2, 0, 2, 0, -2, 0, 2, 0, 2, 4, 4, 2, 0, 2, 0, -2, 0, 2, 0, -2, -4, -2, 0, -2, 0, 2, 0, -2, -4, -2, -4, -6, -4, -2, 0, -2, -4, -2, 0, -2, 0, 2, 4, 2, 0, 2, 0, -2, 0, 2, 0, -2, -4, -2, 0, -2, 0, 2, 4, 2, 0, 2, 0, -2, 0, 2, 4, 2, 0, 2, 4, 2, 4, 6]
我之前的回答是反对你未经编辑的帖子,所以这里有一个更新: 从您提供的代码可以清楚地看出,您必须至少有
i
和j
的循环
单独评估该循环会得到以下列表:
[1,-1,-1,1]
现在,编码中的每个后续嵌套循环仅复制此列表中的每个元素,然后添加上一个循环中的数组(重复两次): i、j和k循环给出
[1,1,-1,-1,-1,-1,1]+[1,-1,-1,
1,1,-1,-1,1]=[2,0,-2,0,0,-2,0,2]
i、j、k和l循环给出[1,1,1,1,1,-1,-1,-1,-1,-1,1,1]+[1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1]=[3,1,1,1,-1,1,-1,1,-1,-1,-1]
等等
因此,您可以简单地尝试以下方法:
adjacent_spin_product_matrix = []
ij_result = [1, -1, -1, 1]
def calc_product(adjacent_spin_product_matrix, number_of_indices):
if number_of_indices == 2:
return ij_result
else:
number_of_duplicates = 2 ** (number_of_indices - 2)
curr_array = []
for elem in ij_result:
for dup in range(number_of_duplicates):
curr_array.append(elem)
prev_array = calc_product(adjacent_spin_product_matrix, number_of_indices - 1)
temp_array = []
temp_array.extend(prev_array)
temp_array.extend(prev_array)
result = []
for i, elem in enumerate(curr_array):
result.append(elem + temp_array[i])
return result
现在,你应该发现:
print(calc_product([], 2)) # equivalent to i and j case
print(calc_product([], 3)) # equivalent to i, j, and k case
print(calc_product([], 4)) # equivalent to i, j, k, and l case
print(calc_product([], 5)) # equivalent to i, j, k, l, and m case
print(calc_product([], 6)) # equivalent to i, j, k, l, m, and o case
print(calc_product([], 7)) # equivalent to i, j, k, l, m, o, and p case
这些都给出了预期的结果:
[1, -1, -1, 1]
[2, 0, -2, 0, 0, -2, 0, 2]
[3, 1, -1, 1, -1, -3, -1, 1, 1, -1, -3, -1, 1, -1, 1, 3]
[4, 2, 0, 2, 0, -2, 0, 2, 0, -2, -4, -2, 0, -2, 0, 2, 2, 0, -2, 0, -2, -4, -2, 0, 2, 0, -2, 0, 2, 0, 2, 4]
[5, 3, 1, 3, 1, -1, 1, 3, 1, -1, -3, -1, 1, -1, 1, 3, 1, -1, -3, -1, -3, -5, -3, -1, 1, -1, -3, -1, 1, -1, 1, 3, 3, 1, -1, 1, -1, -3, -1, 1, -1, -3, -5, -3, -1, -3, -1, 1, 3, 1, -1, 1, -1, -3, -1, 1, 3, 1, -1, 1, 3, 1, 3, 5]
[6, 4, 2, 4, 2, 0, 2, 4, 2, 0, -2, 0, 2, 0, 2, 4, 2, 0, -2, 0, -2, -4, -2, 0, 2, 0, -2, 0, 2, 0, 2, 4, 2, 0, -2, 0, -2, -4, -2, 0, -2, -4, -6, -4, -2, -4, -2, 0, 2, 0, -2, 0, -2, -4, -2, 0, 2, 0, -2, 0, 2, 0, 2, 4, 4, 2, 0, 2, 0, -2, 0, 2, 0, -2, -4, -2, 0, -2, 0, 2, 0, -2, -4, -2, -4, -6, -4, -2, 0, -2, -4, -2, 0, -2, 0, 2, 4, 2, 0, 2, 0, -2, 0, 2, 0, -2, -4, -2, 0, -2, 0, 2, 4, 2, 0, 2, 0, -2, 0, 2, 4, 2, 0, 2, 4, 2, 4, 6]
不需要特别的递归函数 如果使用
itertools.product
,则可以对每个索引数使用单个循环;您也可以使用sum
和zip
简化计算
from itertools import product
...
spin_products = []
n = int(input('how many indices? '))
...
for indices in product([-1, 1], repeat=n):
spin_products.append(sum(i*j for i, j in zip(indices, indices[1:])))
不需要特别的递归函数 如果使用
itertools.product
,则可以对每个索引数使用单个循环;您也可以使用sum
和zip
简化计算
from itertools import product
...
spin_products = []
n = int(input('how many indices? '))
...
for indices in product([-1, 1], repeat=n):
spin_products.append(sum(i*j for i, j in zip(indices, indices[1:])))
我真的不明白。首先,
spin
是一个仅包含2个元素的列表,因此引用spin[3]
等将导致脚本崩溃并出现错误。尽管所有这些循环都定义了循环变量i
直到p
,但您只使用了i
、j
和k
。如果你不能提供一个有效的版本,或者我们无法理解你想做什么,那么没有人能够帮助你简化代码。但是现在这就更没有意义了。为什么要对相同的值迭代这么多次?我要解决的问题是要得到相邻自旋积的矩阵,最终的函数需要使用I,j,k。。。来描述矩阵。因此,对于每个自旋对[-1,1],都有一个for循环,for循环的数量取决于晶格点的数量。它只是自旋,而不是自旋[3]等等。。我重新编辑了代码。基本上,我想把所有for循环压缩成一个递归函数,我还想使用I,j,k。。。。从每个for循环中编写最终函数。所以,我想让你明白我,j,k,l。。。。。。参与代码。正如其他人所说,你的问题并不是有史以来提出的最清楚的。。。我已经发布了一个答案,我相信它的当前版本是中肯的,但不是100%(也不是95%);-)确定它正是你所要求的。你能告诉我,可以吗?还是我最好把它取下来?谢谢,我真的不明白。首先,spin
是一个仅包含2个元素的列表,因此引用spin[3]
等将导致脚本崩溃并出现错误。尽管所有这些循环都定义了循环变量i
直到p
,但您只使用了i
、j
和k
。如果你不能提供一个有效的版本,或者我们无法理解你想做什么,那么没有人能够帮助你简化代码。但是现在这就更没有意义了。为什么要对相同的值迭代这么多次?我要解决的问题是要得到相邻自旋积的矩阵,最终的函数需要使用I,j,k。。。来描述矩阵。所以,对于每个自旋对[