2014-07-05 41 views
0

我想要的東西等同於下面的代碼。 以下代碼會生成可能的手牌模式。如何實現受限組合迭代器?

from itertools import combinations 
m = 13 
n = 4 
x = range(m) * n 
y = 5 
pattern = set() 
for i in combinations(x, y): 
    pattern.add(tuple(sorted(i))) 

我試着用itertools.combinations_with_replacement。毫不奇怪,存在像(0,0,0,0,0)或(1,1,1,1,1)這樣的組合。但是卡片中沒有5個皇后和5個國王。所以我不想採取5件相同的事情。我如何實現受限組合迭代器。

from itertools import combinations_with_replacement 
m = 13 
n = 4 
x = range(m) 
y = 5 
pattern = [] 
for i in combinations_with_replacement(x, y): 
    pattern.append(i) 

我想要下面的代碼。

僞代碼:

m = 13 
n = 4 
x = range(m) 
y = 5 
pattern = [] 
for i in combinations_with_replacement_restricted(x, y, max=n): 
    pattern.append(i) 

附:因爲我是英語學習者,請修改我的語法錯誤。

+0

你是什麼意思最大= N? –

+0

@fish_ball這意味着你不能畫出5個女王或5個國王等,但你最多可以畫4個女王或4個國王等。 –

+0

@keimina你當前的代碼不會畫出同一張牌的5張。爲什麼你想要「替換」,這不是撲克手牌的處理方式。你能否更清楚你目前的代碼存在哪些問題? – jonrsharpe

回答

0

閱讀文檔後:https://docs.python.org/2/library/itertools.html?highlight=combinations#itertools.combinations_with_replacement

我發現,你的目標一個內置的解決方案並不存在。

所以,如果你想這個,我覺得這兩個解決方案可能是合適的:

[1]。使所有的卡片不同:

from itertools import combinations 
m = 13 
n = 4 
x = range(m * n) 
y = 5 
pattern = set() 
# combinations from range(0, 52) 
for i in combinations(x, y): 
    # so p/n maps to range(0, 13) 
    pattern.add((p/n for p in sorted(i))) 

[2]。排除所有無效的結果:

from itertools import combinations 
m = 13 
n = 4 
x = range(m) * n 
y = 5 
pattern = set() 
for i in combinations(x, y): 
    if min(i) == max(i): 
     continue 
    pattern.add(tuple(sorted(i))) 
0

你可以這樣做:

import itertools 
# each card is a pair (value, color) 
cards = [ (value, color) for value in xrange(13) for color in xrange(4) ] 
# all 5 cards combinations within 52 cards 
for hand in itertools.combinations(cards, 5) : 
    print hand