Преобразование «для l oop» в «while l oop» в python - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь преобразовать код, заменив l oop на while l oop. Это код, который я хочу преобразовать

Функции для кода в приведенном ниже фрагменте. На вопрос @ 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

Некоторая часть кода опущена по соображениям конфиденциальности. Ожидаемый результат, ie результат for l oop snippet - это список с длиной (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]

1 Ответ

0 голосов
/ 13 июля 2020

Переменная j = 0 должна быть определена перед внутренним while l oop. В настоящее время ваше внутреннее while работает только раз 'len (s)', также вы индексируете с 'i' во втором l oop, вы должны были использовать там 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)    
...