【问题标题】:Converting "for loop" to "while loop" in python在python中将“for循环”转换为“while循环”
【发布时间】: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


【解决方案1】:

变量 j = 0 应该在内部 while 循环之前定义。目前,您的内部 while 仅运行 'len(s)' 次,而且您在第二个循环中使用 'i' 进行索引,您应该在那里使用 j。

这应该工作

from random import sample

def shuffle(s): return sample(s,len(s)) 
base  = 2
rBase = range(base)
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)
print(rows)
print(cols)        
nums = shuffle(range(1,side+1))
for r in rows:
    for c in cols:
        data.append(nums[pattern(r,c)])

print(data)

rows = []
cols = []
data = []
s = shuffle(rBase)
s2 = shuffle(rBase)
i = 0
while i < len(s):
    r = s[i]
    j = 0
    while j < len(s):
        g = s2[j]
        j = j + 1
        rows.append(g*base+r)
    i = i + 1
i = 0
s = shuffle(rBase)
s2 = shuffle(rBase)
while i < len(s):
    c = s[i]
    j = 0
    while j < len(s):
        g = s2[j]
        cols.append(g*base+c)
        j += 1
    i += 1
nums = shuffle(range(1,side+1))    
i =0
while i < len(rows):
    r = rows[i]
    j = 0
    while j < len(cols):
        c = cols[j]
        data.append(nums[pattern(r,c)])
        j += 1
    i += 1
print(rows)
print(cols)
print(data)    

【讨论】:

  • 谢谢。但我无法理解你的确切意思。如果您将我的代码编辑为正确的代码并通知我,那就太好了。感谢您尝试帮助我
  • @Sreevatsan 看到我编辑的答案。我已经指出了你的错误,希望你能理解
  • @Sreevatsan 我为你留下了最后一个 while 循环,我以为你得到了错误。我已经编辑了我的答案并添加了最后一个 while 循环。看看是否有效
  • 抱歉,您提供的代码不起作用。如果可能,请将此代码从列表理解转换为 while 循环
  • @Sreevatsan 'for loop' 和 'while loop' 的输出都匹配。尝试运行我编辑的代码,它正在工作