Перемешать три списка в одном и том же случайном порядке
Мне нужно перемешать три списка в одном и том же случайном порядке:
пример:
a = ['a', 'b', 'c']
b = [1, 2, 3]
c = [56, 4, 7]
после перемешивания получилось вот так:
a = ['с', 'a', 'b']
b = [3, 1, 2]
c = [7, 56, 4]
я пробовала сделать так (если что, то в x45_90 у меня три строки, то есть это x45_90=[ [],[],[] ]):
x45_90=[
['с', 'a', 'b'] ,
[3, 1, 2] ,
[7, 56, 4],
]
a=[]
b=[]
c=[]
a[:]=x45_90[0][:]
b[:]=x45_90[1][:]
c[:]=x45_90[2][:]
d = list(zip(a, b,c))
random.shuffle(d, random.random)
но выдает ошибку :
TypeError: Random.shuffle() takes 2 positional arguments but 3 were given
Как мне исправить ее?
Ответы (2 шт):
Автор решения: Алексей Р
→ Ссылка
По отредактированной версии исходных данных. Нужно просто распаковать x45_90 при передаче аргументов в zip(): zip(*x45_90).
import random
x45_90 = [
['с', 'a', 'b'],
[3, 1, 2],
[7, 56, 4],
]
x = list(zip(*x45_90))
random.shuffle(x)
a, b, c = (list(y) for y in zip(*x))
print(a, b, c, sep='\n')
['с', 'a', 'b']
[3, 1, 2]
[7, 56, 4]
Передавать второй аргумент в shuffle() не требуется и он удален с версии 3.11.: "Changed in version 3.11: Removed the optional parameter random.".
Автор решения: Stanislav Volodarskiy
→ Ссылка
Есть два подхода: можно смешать списки вместе и можно перемешать индексы.
Смешивая вместе:
import random
a = ['a', 'b', 'c']
b = [1, 2, 3]
c = [56, 4, 7]
# x = [('a', 1, 56), ('b', 2, 4), ('c', 3, 7)] - список троек
x = list(zip(a, b, c))
random.shuffle(x) # перемешиваем тройки
a[:], b[:], c[:] = zip(*x) # разбираем тройки на отдельные списки
print(a)
print(b)
print(c)
Перемешивая индексы:
import random
a = ['a', 'b', 'c']
b = [1, 2, 3]
c = [56, 4, 7]
x = list(range(len(a))) # x = [0, 1, 2] - список индексов
random.shuffle(x) # перемешиваем индексы
# переставляем элементы списков в соответствии с индексами
a[:] = (a[i] for i in x)
b[:] = (b[i] for i in x)
c[:] = (c[i] for i in x)
print(a)
print(b)
print(c)