2014-10-17 3 views
1

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

Вот код, который я использовал

import random 
lis1=[0,1,2,3] 
lis2=[] 
for i in range(6): 
    random.shuffle(lis1) 
    lis2.append(lis1) 
print lis2 

А вот пример результата я получил

[[1,3,2,0],[1,3,2,0],[1,3,2,0],[1,3,2,0],[1,3,2,0],[1,3,2,0]] 

Если я получаю перемешаны списки, как можно отсортировать их в порядке возрастания? Как, я хочу, чтобы получить это -

[[0,1,2,3],[2,3,1,0],[2,1,3,0],[1,0,3,2]] 

в this-

[[0,1,2,3],[1,0,3,2],[2,1,3,0],[2,3,1,0]] 
+1

Вы перетасовываете и добавляете ** тот же список ** 6 раз. – user2864740

+0

См. Http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list-in-python – user2864740

+0

возможный дубликат [Python, инициализирующий список списков] (http: // stackoverflow. com/questions/12791501/python-initializing-a-list-of-lists) (см. ответ, синтаксис '*' отличается, но результат/проблема одинакова) – user2864740

ответ

4

Во-первых, ваш код повторно вставляет lis1 ссылку в lis2. Поскольку lis1 остается неизменным все это время, все элементы lis2 в конечном итоге указывают на один и тот же объект. Чтобы это исправить, необходимо изменить append() линию, чтобы сделать копию списка каждый раз:

lis2.append(lis1[:]) 

Теперь, чтобы отсортировать результат просто вызовите sort() после цикла:

lis2.sort() 
2

Попробуйте что-нибудь попроще:

>>> first = [0,1,2,3] 
>>> jumbled = [random.sample(first, len(first)) for i in range(6)] 
>>> ordered = sorted(jumbled) 
>>> jumbled 
[[0, 3, 2, 1], [1, 0, 2, 3], [0, 2, 1, 3], [0, 1, 2, 3], [0, 2, 3, 1], [0, 3, 2, 1]] 
>>> ordered 
[[0, 1, 2, 3], [0, 2, 1, 3], [0, 2, 3, 1], [0, 3, 2, 1], [0, 3, 2, 1], [1, 0, 2, 3]] 
2

магазин копии lis1 не реально lis1 сделать это:

lis2.append(lis1[:]) 

Тогда код будет:

import random 
lis1=[0,1,2,3] 
lis2=[] 
for i in range(6): 
    random.shuffle(lis1) 
    lis2.append(lis1[:]) 

print lis2 

Выход:

[[2, 3, 1, 0], [0, 3, 2, 1], [3, 0, 1, 2], [1, 2, 0, 3], [3, 0, 2, 1], [1, 0, 3, 2]] 
0
import random 
lis1=[0,1,2,3] 
lis2=[] 
for i in range(6): 
    r = random.randint(0,len(lis1)) 
    #print(r) 
    lis2.append(lis1[r:]+lis1[:r]) 
print(lis2) 
print(sorted(lis2)) 
+1

Это может производить только небольшое подмножество перестановок. – NPE

+0

Да, я согласен, что он вращает список, не перетасовывая. Я не заметил, что при публикации. Благодарим за упоминание –

Смежные вопросы