2016-04-18 2 views
-3

У меня есть набор списков в Python, и я хочу, чтобы перетасовать их обоих, но переключающих элементов в тех же позициях в обоих списках, какСлучайные перетасовать несколько списков питона

  a=[11 22 33 44] b = [66 77 88 99] 
      *do some shuffeling like [1 3 0 2]* 
      a=[22 44 11 33] b = [77 99 66 88] 

Возможно ли это?

+1

Да! Вы можете генерировать случайные числа между 0 и длиной самого длинного и перемещать элементы. Но что вы пробовали? – Llopis

ответ

1

Вот решение, которое использует списковый:

>>> a = [11, 22, 33, 44] 
>>> b = [66, 77, 88, 99] 
>>> p = [1, 3, 0, 2] 
>>> 
>>> [a[i] for i in p] 
[22, 44, 11, 33] 
>>> 
>>> [b[i] for i in p] 
[77, 99, 66, 88] 
>>> 
1

Вы можете использовать zip совместно с оператором random.shuffle:

a = [1,2,3,4]   # list 1 
b = ['a','b','c','d'] # list 2 
c = zip(a,b)   # zip them together 
random.shuffle(c)  # shuffle in place 
c = zip(*c)   # 'unzip' them 
a = c[0] 
b = c[1] 
print a    # (3, 4, 2, 1) 
print b    # ('c', 'd', 'b', 'a') 

Если вы хотите сохранить, а в виде списков, то просто использование a=list(c[0]). Если вы не хотите, чтобы они перезаписывали исходный файл a/b, переименуйте его как a1=c[0].

0

Расширение на ответ Тома, вы можете сделать список р легко и рандомизации это так:

import random  
p = [x for x in range(len(a))] 
random.shuffle(p)  

Это работает для любых списков размера, но я предполагаю, что из вашего примера, что они все равны в размере.

Ответ Тома:

Вот решение, которое использует списковых:

а = [11, 22, 33, 44] б = [66, 77, 88, 99] р = [1, 3, 0, 2]

[а [I] для я в р]

[22, 44, 11, 33]

[б [я] для я в р]

[77, 99, 66, 88]

0
a=[11,22,33,44] 
order = [1,0,3,2]      #give the order 
new_a = [a[k] for k in order] #list comprehension that's it 

Вы просто отдать приказ, а затем сделать список понимание, чтобы получить новый список

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