Рандомизация двух списков и поддержание порядка в python
Скажем, у меня есть два простых списка,
a = ['Spears', "Adele", "NDubz", "Nicole", "Cristina"]
b = [1,2,3,4,5]
len(a) == len(b)
Я хотел бы сделать рандомизацию a
и b
, но сохранить порядок. Итак, что-то вроде:
a = ["Adele", 'Spears', "Nicole", "Cristina", "NDubz"]
b = [2,1,4,5,3]
Я знаю, что я могу перетасовать один список, используя:
import random
random.shuffle(a)
Но это просто рандомизирует a
, тогда как я хотел бы рандомизировать a
и поддерживать "рандомизированный порядок" в списке b
.
Поблагодарили бы за какие-либо указания относительно того, как это можно достичь.
Ответы
Ответ 1
Я бы объединил два списка вместе, перетасовывал этот результирующий список, а затем разделил их. Это использует zip()
a = ["Spears", "Adele", "NDubz", "Nicole", "Cristina"]
b = [1, 2, 3, 4, 5]
combined = list(zip(a, b))
random.shuffle(combined)
a[:], b[:] = zip(*combined)
Ответ 2
Используйте zip
, у которого есть хорошая функция для работы в обоих направлениях.
import random
a = ['Spears', "Adele", "NDubz", "Nicole", "Cristina"]
b = [1,2,3,4,5]
z = zip(a, b)
# => [('Spears', 1), ('Adele', 2), ('NDubz', 3), ('Nicole', 4), ('Cristina', 5)]
random.shuffle(z)
a, b = zip(*z)
Ответ 3
Обратите внимание, что ответ Тима работает только в Python 2, а не на Python 3. Если вы используете Python 3, вам нужно сделать:
combined = list(zip(a, b))
random.shuffle(combined)
a[:], b[:] = zip(*combined)
иначе вы получите сообщение об ошибке:
TypeError: object of type 'zip' has no len()
Ответ 4
Другим способом может быть
a = ['Spears', "Adele", "NDubz", "Nicole", "Cristina"]
b = range(len(a)) # -> [0, 1, 2, 3, 4]
b_alternative = range(1, len(a) + 1) # -> [1, 2, 3, 4, 5]
random.shuffle(b)
a_shuffled = [a[i] for i in b] # or:
a_shuffled = [a[i - 1] for i in b_alternative]
Это обратный подход, но может помочь вам тем не менее.