0

5 人の男の子と 5 人の女の子がいるある種のコンテストがあるとします。

boys = ["Boy1", "Boy2", "Boy3", "Boy4", "Boy5"]
girls = ["Girl1", "Girl2", "Girl3", "Girl4", "Girl5"]

すべての男の子が 1 人の女の子と対戦し、ゲームをします。itertoolsすべてのペアのすべての組み合わせを生成する Pythonic の方法 (おそらく関係する?) は何ですか?

たとえば、組み合わせは次のようになります。

combination1 = [("Boy1", "Girl1"), ("Boy2", "Girl2"), 
                ("Boy3", "Girl3"), ("Boy4", "Girl4"), ("Boy5", "Girl5")]

したがって、Boy1 は Girl1 と対戦します。Boy1 が Girl1 と対戦する場合、他の女の子は彼と対戦できません。

4

3 に答える 3

3
from itertools import product

l1 = ["boy1","boy2","boy3"]
l2 = ["girl1","girl2","girl3"]

print list(product(l1,l2))

出力は次のとおりです。

[('boy1', 'girl1'), ('boy1', 'girl2'), ('boy1', 'girl3'), 
 ('boy2', 'girl1'), ('boy2', 'girl2'), ('boy2', 'girl3'), 
 ('boy3', 'girl1'), ('boy3', 'girl2'), ('boy3', 'girl3')]
于 2012-12-20T11:48:45.350 に答える
2

別のアイデア:

>>> zip(boys, random.sample(girls, len(girls)))
[('Boy1', 'Girl3'), ('Boy2', 'Girl2'), ('Boy3', 'Girl4'), ('Boy4', 'Girl1'), 
 ('Boy5', 'Girl5')]
于 2012-12-20T11:42:43.223 に答える
2

これでうまくいくはずです:

シャッフルは、男の子と女の子が互いにペアになる何らかの形のランダム性を与えます

In [115]: boys = ["Boy1", "Boy2", "Boy3", "Boy4", "Boy5"]

In [116]: girls = ["Girl1", "Girl2", "Girl3", "Girl4", "Girl5"]

In [117]: random.shuffle(girls)

In [118]: girls
Out[118]: ['Girl5', 'Girl4', 'Girl3', 'Girl1', 'Girl2']

In [119]: for i in itertools.izip(boys, girls):
   .....:     print i
   .....:     
('Boy1', 'Girl5')
('Boy2', 'Girl4')
('Boy3', 'Girl3')
('Boy4', 'Girl1')
('Boy5', 'Girl2')

編集:可能なすべてのペアリングが必要な場合は、これをチェックしてください:

In [126]: boys
Out[126]: ['Boy1', 'Boy2', 'Boy3', 'Boy4', 'Boy5']

In [127]: girls
Out[127]: ['Girl1', 'Girl2', 'Girl3', 'Girl4', 'Girl5']

In [128]: [girls[i:]+girls[:i] for i in xrange(len(girls))]
Out[128]: 
[['Girl1', 'Girl2', 'Girl3', 'Girl4', 'Girl5'],
 ['Girl2', 'Girl3', 'Girl4', 'Girl5', 'Girl1'],
 ['Girl3', 'Girl4', 'Girl5', 'Girl1', 'Girl2'],
 ['Girl4', 'Girl5', 'Girl1', 'Girl2', 'Girl3'],
 ['Girl5', 'Girl1', 'Girl2', 'Girl3', 'Girl4']]

In [129]: for combo in (itertools.izip(boys, g) for g in ( girls[i:]+girls[:i] for i in xrange(len(girls)) )):
   .....:    for pair in combo:
   .....:        print pair,
   .....:    print ''
   .....:     
('Boy1', 'Girl1') ('Boy2', 'Girl2') ('Boy3', 'Girl3') ('Boy4', 'Girl4') ('Boy5', 'Girl5') 
('Boy1', 'Girl2') ('Boy2', 'Girl3') ('Boy3', 'Girl4') ('Boy4', 'Girl5') ('Boy5', 'Girl1') 
('Boy1', 'Girl3') ('Boy2', 'Girl4') ('Boy3', 'Girl5') ('Boy4', 'Girl1') ('Boy5', 'Girl2') 
('Boy1', 'Girl4') ('Boy2', 'Girl5') ('Boy3', 'Girl1') ('Boy4', 'Girl2') ('Boy5', 'Girl3') 
('Boy1', 'Girl5') ('Boy2', 'Girl1') ('Boy3', 'Girl2') ('Boy4', 'Girl3') ('Boy5', 'Girl4') 

EDIT 2 (EDIT 1 を修正):

>>> perms = itertools.permutations(girls)
>>> len([tuple(p) for p in (itertools.product(boys, g) for g in perms)])
120
>>> perms = itertools.permutations(girls)
>>> len(set(tuple(p) for p in (itertools.product(boys, g) for g in perms)))
120

len120 通りの組み合わせがあり、投稿を散らかしたくなかったので、私はそれを採用しなければなりませんでした。これが存在する理由でありlen(...)len(set(...))

于 2012-12-20T11:40:19.463 に答える