リスト内の2つのリスト間でランダム化を実行し、辞書を返す方法はpythonにありますか?
たとえば、次から:
[[1,2,3,4], ['a','b','c','d']]
に:
[{3:'a'}, {1:'d'}, {2:'c'}, {4:'b'}]
これを達成するための最良の方法は何ですか?リスト内包表記を使用していますか? 私の 2 つのリストは実際には非常に大きいので、より効率的な代替手段があるかどうか疑問に思っています。
リスト内の2つのリスト間でランダム化を実行し、辞書を返す方法はpythonにありますか?
たとえば、次から:
[[1,2,3,4], ['a','b','c','d']]
に:
[{3:'a'}, {1:'d'}, {2:'c'}, {4:'b'}]
これを達成するための最良の方法は何ですか?リスト内包表記を使用していますか? 私の 2 つのリストは実際には非常に大きいので、より効率的な代替手段があるかどうか疑問に思っています。
import random
keys, values = [[1,2,3,4], ['a','b','c','d']]
random.shuffle(values)
result = [{k:v} for k, v in zip(keys, values)]
次のようなリストを生成します。
In [7]: result
Out[7]: [{1: 'd'}, {2: 'b'}, {3: 'c'}, {4: 'a'}]
よりメモリ効率の良い代替手段は、反復子を使用することです。
import itertools as IT
result = ({k:v} for k, v in IT.izip(keys, values))
より大きな問題は、なぜ一連の小さな辞書が必要なのかということです。Steven Rumbalski の回答によって作成されたような dict を 1 つ持つ方が便利ではないでしょうか?
または、本当にランダムなペアリングが必要な場合は、おそらくタプルのイテレータで十分です。
result = IT.izip(keys, values)
これにより、質問のリクエストとして単一項目の辞書のリストではなく、単一の辞書が作成されます。本当にそれが必要な場合は、unutbu's answerを使用してください。
import random
a = [1,2,3,4]
b = ['a','b','c','d']
random.shuffle(a)
result = dict(zip(a, b))
ソースリストを変更できない場合:
dx = range(len(a))
random.shuffle(dx)
dict(zip((a[i] for i in dx), b))