Подтвердить что ты не робот

Рандомизация двух списков и поддержание порядка в 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.

Поблагодарили бы за какие-либо указания относительно того, как это можно достичь.

4b9b3361

Ответ 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]

Это обратный подход, но может помочь вам тем не менее.