2016-04-25 13 views
2

は、しかし、結果は多少ありますランダムな非:順列効率的

for r in itertools.product(list1, list2): 
     target.write("%s,%s" % (r[0], r[1]) 

誰もが、私は唯一の2順列を抽出することができ、そして、彼らは完全にランダムであるが、それらが繰り返されないことを保証します。このように実装することができます方法を知っていますか?

+0

リストにはいくつの要素がありますか?私はそれを使用しています – Hun

+0

目的は、実際に5つのリスト、100人の奇数のメンバーとそれぞれ効率的にitertools.product'はリスト内包よりも若干速いように思わランダム非繰り返しサンプル – user3484575

答えて

2

あなたがrandom.choice()使用することができます。

>>> from itertools import product 
>>> import random 
>>> l1 = ['a', 'b', 'c'] 
>>> l2 = ['d', 'e', 'f'] 
>>> prod = tuple(product(l1, l2)) 
>>> 
>>> random.choice(prod) 
('c', 'e') 
>>> random.choice(prod) 
('a', 'f') 
>>> random.choice(prod) 
('c', 'd') 

それとも単に製品を作成するためのネストされたリストの内包表記を使用します。あなたはセットを使用することができます重複するアイテムを生成したくない場合は

>>> lst = [(i, j) for j in l2 for i in l1] 

をそれから、その後、指定された順序なしにすることができます単に鍋の項目をあなたの製品から設定オブジェクトを作成するオブジェクト:

>>> prod = set(product(l1, l2)) 
>>> 
>>> prod.pop() 
('c', 'f') 
>>> prod.pop() 
('a', 'f') 
>>> prod.pop() 
('a', 'd') 

また、イヤーンがシャッフルするためにシャッフルを使用してください。

+0

を '抽出するための必要性を持っています。 –

+0

@ByteCommanderいいえ、それはジェネレータを返すので、メモリの使用量に関しては最適化されていません。 – Kasramvd

+0

こんにちはKasramvd。レスポンスありがとう!あなたの最初の提案に関して、product()とは何ですか?私が間違っている場合は私を修正しますが、これは2つのリストの特定の組み合わせが2回表示されないことを保証しません。明らかにこれは大規模なリストについてはほとんどありませんが、私は重複のリスクなしに無作為化順列を生成するための効率的な方法を探しています(学習/関心の純粋な運動 - 私は、このための実際の使用例はよく分からない) – user3484575

1

あなたは結果が繰り返されることはありませんことを確認するために、その後random.shufflepopを使用することができます:それはそれらのすべてを生成し、保存するよう

list1 = ["a", "b"] 
list2 = ["c", "d"] 
p = list(itertools.product(list1, list2)) 
random.shuffle(p) 
e1 = p.pop() 
e2 = p.pop() 

list(itertools.product())は効率的ではありません。大きなリストがある場合は、一度に1つずつ生成し、それらが複製されているかどうかを確認することができます。

s = set() 
list1 = ["a", "b"] 
list2 = ["c", "d"] 
while True: 
    r = (random.choice(list1), random.choice(list2)) 
    if r not in s: 
     target.write("%s,%s" % (r[0], r[1])) 
     s.add(r) 
     break 
+0

1つのランダム要素を選択するのではなく、リスト全体をシャッフルすることは、少なくとも4つ以上のランダム要素が必要になるとすぐに高速になります。結果がより少なくなるように、Kasramvdの答えに記載されているように単一項目を選択するのがやや高速です。 - そして、あなたの2番目の選択肢は、メモリを節約するための非常に良いアプローチです!すばらしいです。 –

+1

@ByteCommander私は同意しますが、それらの 'random.choice'呼び出しは独立しているので、同じ結果が得られます(実際には、Kasramvdの答えの2番目の呼び出しで同じ結果が生成されます)。 – ayhan