Вопрос:

случайный цикл Python в случайном порядке

python list random while-loop

713 просмотра

2 ответа

719 Репутация автора

Я пытаюсь заполнить списки с перестановками одного и того же начального списка. Я не понимаю, почему следующее не работает.

parts = [[],[]]
while len(parts[-1]) < 2:
  newval = random.choice([[1,2,3,4],[5,6,7,8]])
  for part in parts:
    random.shuffle(newval)
    part.append(newval)

Ожидаемый результат будет примерно таким: [[[6,7,8,5],[1,3,4,2]],[[5,8,6,7],[4,2,3,1]]]

Автор: mrtnmgs Источник Размещён: 22.08.2016 09:16

Ответы (2)


6 плюса

113270 Репутация автора

Решение

random.shuffleработает на месте и, следовательно, модифицируется newval. Вы должны сделать копию при добавлении в partпротивном случае тот же список (или ссылка на список) перемешивается и сохраняется в part.

import random

parts = [[],[]]
while len(parts[-1]) < 2:
  newval = random.choice([[1,2,3,4],[5,6,7,8]])
  for part in parts:
    random.shuffle(newval)
    part.append(newval[:])

print(parts)

Возможные выходы:

[[[3, 1, 2, 4], [5, 7, 6, 8]], [[1, 2, 4, 3], [6, 7, 5, 8]]]
[[[1, 3, 2, 4], [4, 2, 1, 3]], [[2, 4, 3, 1], [4, 3, 2, 1]]]
[[[7, 5, 6, 8], [3, 2, 4, 1]], [[8, 5, 6, 7], [1, 4, 3, 2]]]
Автор: Jean-François Fabre Размещён: 22.08.2016 09:22

3 плюса

1753 Репутация автора

Потому что в Python все ссылки. Когда вы добавляете значение в массив, фактически вы добавляете ссылку на место в памяти, где хранится значение.

Скажем, вы назначили список первому элементу. Когда на следующей итерации вы перетасовываете этот список, вы меняете значение в памяти. Таким образом, значение, которое вы получите при доступе к элементу, добавленному вами на предыдущем шаге, также будет изменено.

Чтобы это исправить, попробуйте добавить, copy.copy(newval)а не просто newval(не забудьте import copy)

Вот ваш код изменился соответственно:

import copy
parts = [[],[]]
while len(parts[-1]) < 2:
    newval = random.choice([[1,2,3,4],[5,6,7,8]])
    for part in parts:
        random.shuffle(newval)
        part.append(copy.copy(newval))
Автор: Dmitry Torba Размещён: 22.08.2016 09:26
Вопросы из категории :
32x32