2017-01-10 7 views
1

定義によると、シーケンスとは、少なくとも3枚の数字の連続したカード(連続した数字)の組み合わせです。スーツは関係ありません。例:6♥7♥8♠または3♦4♥5♦6♥手元にある可能なすべてのカードのリストを表示する

この部分コードでは、3つのカードのすべての可能な組み合わせを一覧表示できます。 self.handにあるカードが既にランクの点でソートされていると仮定します。

if len(self.hand) > 2: 
    for i in range(len(self.hand)-2): 
     for j in range(i+1,len(self.hand)-1): 
      for k in range(j+1,len(self.hand)): 
       combo = Combo([self.hand[i],self.hand[j],self.hand[k]]) 
       if combo.isSequence(): 
        possibleCombos.append(combo) 

私は4枚のカード、5枚のカードなどの一連のために、このようなコードを繰り返すことができますが、これを行うために、よりコンパクトな方法はありますか?私はシーケンスが長くなるにつれて、いくつかのループを制御する方法を見つけることができませんでした。

+3

あなたは連続した数字を意味するか、ちょうど昇順ですか? – asongtoruin

答えて

4

定義によると、シーケンスは、数字の順序で少なくとも3枚のカードの組み合わせです。

これはうまくいくと思います。私はスーツなしで5枚の異なるカード(1-5)のセットを想定しています。私はまた、数字が昇順でなければならないと仮定しています。私はそれを明確にする必要があります(asongtoruinに質問してくれてありがとう)。

import itertools 


def all_card_sequences_of_size(cards, n): 
    return itertools.combinations(cards, n) 


if __name__ == '__main__': 
    cards = [i + 1 for i in range(5)] 
    print(list(all_card_sequences_of_size(cards, 3))) 
    print(list(all_card_sequences_of_size(cards, 4))) 

あなたが連続しているシーケンスを必要としないと仮定すると、出力

[(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5)] 
[(1, 2, 3, 4), (1, 2, 3, 5), (1, 2, 4, 5), (1, 3, 4, 5), (2, 3, 4, 5)] 

が、ここではそのためのソリューションがあります:

import itertools 

def is_sequence_consecutive(sequence): 
    return all(a == b - 1 for a, b in zip(sequence[:-1], sequence[1:])) 


def all_card_sequences_of_size(cards, n): 
    for sequence in itertools.combinations(cards, n): 
     if is_sequence_consecutive(sequence): 
      yield sequence 


if __name__ == '__main__': 
    cards = [i + 1 for i in range(5)] 
    print(list(all_card_sequences_of_size(cards, 3))) 
    print(list(all_card_sequences_of_size(cards, 4))) 

出力

[(1, 2, 3), (2, 3, 4), (3, 4, 5)] 
[(1, 2, 3, 4), (2, 3, 4, 5)] 

nの全ての可能な連続配列カードの数(N> = 3)を取得し、 "数値列" によって

import itertools 


def is_sequence_consecutive(sequence): 
    return all(a == b - 1 for a, b in zip(sequence[:-1], sequence[1:])) 


def all_card_sequences_of_size(cards, n): 
    for sequence in itertools.combinations(cards, n): 
     if is_sequence_consecutive(sequence): 
      yield sequence 


def all_card_sequences(cards): 
    for i in range(3, len(cards) + 1): 
     yield from all_card_sequences_of_size(cards, i) 


if __name__ == '__main__': 
    cards = [i + 1 for i in range(5)] 
    print(list(all_card_sequences(cards))) 

出力

[(1, 2, 3), (2, 3, 4), (3, 4, 5), (1, 2, 3, 4), (2, 3, 4, 5), (1, 2, 3, 4, 5)] 
+0

何について '1,2,3,4,5' – Navidad20

+1

2番目の引数は、描画するカードの数です。 '5'で同じことをしてそのシーケンスを得ることができます。ご希望の場合は、投稿を変更してすべてのサイズのシーケンスを生成することができます。 – Tagc

+0

いいえ、それは私の質問ではありません – Navidad20

関連する問題