【发布时间】:2024-05-29 21:00:01
【问题描述】:
我正在尝试通过将 for 循环替换为 while 循环来转换代码。
这是我要转换的代码
下面sn-p中代码的功能。 @Sameer 提问
from random import sample
def shuffle(s): return sample(s,len(s))
rBase = range(base)
base = 2
side = base*base
def pattern(r,c):
return (base*(r%base)+r//base+c)%side
我遇到问题的代码
rows = []
cols = []
data = []
for r in shuffle(rBase):
for g in shuffle(rBase):
rows.append(g*base+r)
for c in shuffle(rBase):
for g in shuffle(rBase):
cols.append(g*base+c)
nums = shuffle(range(1,side+1))
for r in rows:
for c in cols:
data.append(nums[pattern(r,c)])
这是我尝试的代码
rows = []
cols = []
data = []
s = shuffle(rBase)
i,j = 0,0
while i < len(s):
r = s[i]
while j < len(s):
s2 = shuffle(rBase)
g = s2[i]
rows.append(g*base+r)
j+=1
i += 1
i,j = 0,0
s = shuffle(rBase)
while i < len(s):
c = s[i]
while j < len(s):
s2 = shuffle(rBase)
g = s2[i]
cols.append(g*base+c)
j += 1
i += 1
nums = shuffle(range(1,side+1))
i,j =0,0
while i < len(rows):
r = rows[i]
while j < len(cols):
c = cols[i]
data.append(nums[pattern(r,c)])
j += 1
i += 1
出于隐私原因,省略了部分代码。
预期的输出,即 for 循环 sn-p 的输出是一个长度为 (base ** 4) 的列表,其中包含从 1 到 base ** 2 的每个数字正好 base ** 2 次。
例如:
如果基数为 2:
预期输出类似于[3, 2, 1, 4, 4, 1, 3, 2, 1, 4, 2, 3, 2, 3, 4, 1]
实际输出是一个长度基数列表,每个元素是一个介于 1 和基数 ** 2 之间的随机数。(包括基数 ** 2) 例如: 如果基数为 2: 实际输出类似于 [1,1] 或 [2,2] 或 [3,3] 或 [4,4]
【问题讨论】:
-
您好,欢迎来到 *。您是否尝试过使用列表理解?
while循环并不是真正的处理事物列表的pythonic方式(即使它们的使用是完全合法的!) -
@smwhr BTW,起初我有一个列表理解版本。我将其更改为 for 循环,因为我希望将代码转换为具有类似 C 语法的 JavaScript。由于 JS 对每个循环或数组操作的列表理解没有效率,我尝试将代码从“for 循环”转换为“while 循环”。感谢您的评论
-
所以你的目标是在 javascript 中有一个更“通用”的算法?
标签: python list for-loop while-loop