31405


2つのリストから要素をランダムに組み合わせて表示していく方法についてです。

２つのリストlistAとlistBがあり、それぞれに100個の要素があります。  
各リストから一つずつ要素をランダムで取り出し、ペアで数字を全て表示していきます。その際、表示する位置もランダムにしたいと考えています。  
表示した際、  
【A1 B3】  
【B70 A50】  
【A23 B40】  
…  
となるようにです。

listAとBからランダムに要素を取り出し、それらをさらにランダムに別の２つのリストlistC、listDに格納していき、最終的にlistCとDの要素をペアで表示できればと考えています。

よろしくお願いします。


CC BY-SA 3.0
2016-12-26T06:05:00.317
31403
2017-01-13T02:22:09.687
7677
question
python
リストの要素をランダムに組み合わせて表示する


新たな条件追加がありましたので下記のように変更しました。

[code]

    import random
    x = ['a1', 'a2', 'a3', 'a4', 'a5', 'a6']
    y = ['b1', 'b2', 'b3', 'b4', 'b5', 'b6']
    random.shuffle(x)
    random.shuffle(y)
    shuffled = [[i, j] for i, j in zip(x, y)]
    
    ar1 = [shuffled[j - 1] for j in random.sample([i + 1 for i in range(len(shuffled))], int(len(shuffled) / 2))]
    ar2 = [[i[1], i[0]] for i in tuple(set(map(tuple, ar1)) ^ set(map(tuple, shuffled)))]
    ar1.extend(ar2)
    result = [ar1[i] for i in random.sample(range(len(ar1)), len(ar1))]
    
    listC = [z[0] for z in result]
    listD = [z[1] for z in result]
    print(listC)
    print(listD)
    
    >>> ['a3', 'b5', 'a5', 'b2', 'b4', 'a6']
    >>> ['b1', 'a1', 'b6', 'a2', 'a4', 'b3']
    
[/code]

流れは次の通りです。

  1. a群, b群をそれぞれシャッフルして2次元配列を作成
  2. ar1 → 2次元配列からその要素数の半分をランダムで取得
  3. ar2 → 残りの半分に対してそれぞれの要素を入れ替え
  4. result → それぞれを足し合わせて順番をシャッフル
  5. listC, listD → 分離


CC BY-SA 3.0
2016-12-26T07:37:16.603
31405
2017-01-13T02:22:09.687
2017-01-13T02:22:09.687
19460
19460
31403
answer


`zip`がタプルを返すので、 それに合わせてイミュータブルを扱うコードです。  
シャッフルの手順はTanaikeさんと同じです。

[code]

    import random
    
    def imshuffle(x):
        return random.sample(x,k=len(x))
    
    listA=[1,2,3,4,5]
    listB=[6,7,8,9,10]
    
    shuffled=map(imshuffle, zip(imshuffle(listA),imshuffle(listB)))
    
    [listC,listD]=map(list,zip(*shuffled))
    
    print shuffled
    print listC
    print listD
    
[/code]

`random.sample(x,k=len(x))`は[公式のドキュメントから](https://docs.python.org/dev/library/random.html#random.shuffle)借りてきたイミュータブルなシャッフルです。

実行結果

[code]

    % python shuffle.py
    [[2, 7], [6, 5], [1, 9], [8, 3], [10, 4]]
    [2, 6, 1, 8, 10]
    [7, 5, 9, 3, 4]
    
[/code]


CC BY-SA 3.0
2016-12-27T09:05:57.837
31468
2016-12-27T09:13:48.470
2016-12-27T09:13:48.470
13199
13199
31403
answer