Список Python не перемешивается в цикле - PullRequest
7 голосов
/ 25 января 2011

Я пытаюсь создать случайный список ключей, повторяя:

import random

keys = ['1', '2', '3', '4', '5']
random.shuffle(keys)
print keys

Это прекрасно работает. Однако, если я положу его в цикл и получу вывод:

a = []
for x in range(10):
    random.shuffle(keys)
    a.append(keys)

Я получаю 10 раз одного и того же шаффла ?! Очевидно, что-то здесь в корне не так ... Заранее спасибо.

Ответы [ 2 ]

16 голосов
/ 25 января 2011

Проблема в том, что вы перетасовываете список на месте, а затем добавляете ссылку списка в объединенный список. Таким образом, вы получите одну и ту же структуру списка 10 раз. «Фундаментальное изменение» заключается в том, что список должен быть скопирован перед его добавлением.

Вот немного более "питонный" способ достижения того же результата с помощью понимания списка.

import random

def shuffleACopy(x):
        b = x[:] # make a copy of the keys
        random.shuffle(b) # shuffle the copy
        return b # return the copy

keys = [1,2,3,4,5,6,7,8]
a = [shuffleACopy(keys) for x in range(10)]
print(a)
3 голосов
/ 25 января 2011

Hypnos уже ответил на очень правильное решение, поэтому я просто даю вам более наглядный способ понять, что произошло, и как определить подобные вещи в будущем:

import random
keys = ['1', '2', '3', '4', '5']
a = []
for x in range(10):
    random.shuffle(keys)
    a.append(keys)
    print a

дает:

[['4', '5', '3', '2', '1']]
[['2', '5', '1', '4', '3'], ['2', '5', '1', '4', '3']]
[['2', '5', '4', '1', '3'], ['2', '5', '4', '1', '3'], ['2', '5', '4', '1', '3']]
[['5', '4', '3', '1', '2'], ['5', '4', '3', '1', '2'], ['5', '4', '3', '1', '2'], ['5', '4', '3', '1', '2']]
[['1', '4', '3', '2', '5'], ['1', '4', '3', '2', '5'], ['1', '4', '3', '2', '5'], ['1', '4', '3', '2', '5'], ['1', '4', '3', '2', '5']]
[['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5']]
[['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3']]
[['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1']]
[['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1']]
[['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1']]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...