2017-01-10 4 views
1

По определению последовательность представляет собой комбинацию из по меньшей мере трех карт, которые находятся в числовой последовательности (последовательные номера). Костюмы не имеют значения. Пример: 6 ♥ 7 ♥ 8 ♠ или 3 ♦ 4 ♥ 5 ♦ 6 ♥Отображение всей возможной последовательности карт в руке

В этом частичном коде я могу перечислить все возможные комбинации только трех карт. Предположим, что карты в 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

По определению последовательность представляет собой комбинацию по меньшей мере трех карт, которые находятся в числовой последовательности.

Я считаю, что это должно сработать. Я предполагаю набор из 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)] 

Для того, чтобы получить все возможные последовательности последовательных по п числа карт (п> = 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

Второй аргумент - количество карт для розыгрыша. Вы можете сделать то же самое с '5', чтобы получить эту последовательность. Если вы хотите, я могу изменить свой пост, чтобы генерировать последовательности всех размеров. – Tagc

+0

Нет, ты прав, его не мой вопрос, хотя – Navidad20