Перемешивание списка - PullRequest
0 голосов
/ 16 ноября 2011

в этой программе я пытаюсь перетасовать список, случайным образом выбирая два элемента из списка и меняя их местами, а затем повторяя этот процесс несколько раз.

Проблема, с которой я столкнулся, заключается в том, что я нене знаю, как я могу поменять местами элементы и напечатать перетасованный список.

Например, если мои два случайных значения были a и b, если бы я просто поставил:

a = b
b = a

тогдаэто изменило бы значение a на b, но когда он попытается изменить b на a, никаких изменений не произойдет, так как a уже было изменено на b.

Единственный способ, которым я могу думать, что это будет работать, этопоменять их местами одновременно, но я не знаю функции / способа поменять их местами.

Также, если a, b были элементами списка L, после того, как я поменял их местами, если использовал

print L

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

NB Я пытаюсь перетасовать этот список поэтапно, меняя местами, вместо того, чтобы использовать функцию случайного выбора, импортированную из random.

Ответы [ 5 ]

4 голосов
/ 16 ноября 2011

Функция random.shuffle также использует своппинг. Стоит взглянуть на его исходный код :

def shuffle(self, x, random=None, int=int):
    """x, random=random.random -> shuffle list x in place; return None.

    Optional arg random is a 0-argument function returning a random
    float in [0.0, 1.0); by default, the standard random.random.
    """

    if random is None:
        random = self.random
    for i in reversed(xrange(1, len(x))):
        # pick an element in x[:i+1] with which to exchange x[i]
        j = int(random() * (i+1))
        x[i], x[j] = x[j], x[i]

Посмотрите, как в последней строке выполняется обмен, используя упаковку и распаковку кортежей .

В качестве альтернативы упаковке и распаковке традиционный способ замены переменных заключается в использовании временной переменной:

t    = x[i]
x[i] = x[j]
x[j] = t
4 голосов
/ 16 ноября 2011

В Python вы можете поменять две переменные следующим образом:

a, b = b, a

Это называется многократным присваиванием, вы можете найти больше информации об этом здесь .

В других языках это обычно делается назначением временной переменной:

tmp = a
a = b
b = tmp

Разве Python не хорош?

3 голосов
/ 16 ноября 2011

Используйте временную переменную для вашей первой проблемы:

temp = a
a = b
b = temp

В Python вы также можете сделать это:

a, b = b, a

Я подозреваю, что ваша вторая проблема заключается в том, что вы изменяете то, что вышли из списка, а не меняете список. Попробуйте это:

i, j = # two indexes to swap in the list
L[i], L[j] = L[j], L[i]
1 голос
/ 16 ноября 2011

Использовать временную переменную:

temp = a
a = b
b = temp
0 голосов
/ 17 ноября 2011

http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

Известно, что просто поменяться местами.

Не забывайте, что если у вас есть n предметов, их будет n! договоренности. Если ваше случайное число составляет 32 бита, есть 2 ^ 32 числа.

Тогда трудно перетасовать колоду карт с 32-битным числом 52! намного больше чем 2 ^ 32

...