2017-08-30 2 views
0

comme un projet pour s'habituer à écrire en Python (la seule langue dont j'ai connaissance pour le moment) J'écris un compteur de score Cribbage.Insérer des listes à une liste imbriquée dans une boucle forcée en Python

J'ai trouvé tous les sous-ensembles de longueur 3, 4 et 5 à partir d'un ensemble de 5 nombres. Les sous-ensembles sont tous classés par ordre numérique. La fonction ci-dessous est censée trouver les sous-ensembles qui sont des nombres dans l'ordre, par exemple [1, 2, 3] ou [3, 4, 5].

def straight_counter(subset, length): 
    straights = [] 
    a = 0 # Variable for incremental increase 
    for i in range(0, length - 2): # Select one of the first three numbers of a set of 3-5 (which are already ordered) 
     run = 1 
     x = 1 

     while i + x < length: # Ensure that we do not go beyond the final index 

      if subset[i + x - 1] + 1 == subset[i + x]: # Is the next number one greater than the currently selected number 

       run += 1 # Count how many numbers we have in order (will be maximum of 5) 
       x += 1 

      else: 
       break 

est ici où j'essaie d'obtenir uniquement les sous-ensembles qui sont tous les numéros dans l'ordre. Mais lorsque je tente d'ajouter dans une liste imbriquée je continue à écrire sur le premier indice de la liste à chaque fois et la liste est que jamais un élément à long quand je l'imprime

  if run == length: # If the run of consecutive numbers uses all of the numbers e.g [1, 2, 3] and not [1, 2, 4] 

       straights.insert(a, subset) # I would like to add the list as the first index of a different list 

       a += 1 # Increase a so that the next valid subset will be at the next index 
       print(straights) 

Y at-il une raison évidente pour laquelle cette est passe? Ou peut-être y a-t-il une façon plus simple d'essayer cela. Merci

Par exemple dans la liste d'entrée des numéros

[1, 1, 2, 3, 4]

Je cherche à créer une liste imbriquée de:

[[1, 2, 3], [1, 2, 3], [2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]].

Quels sont tous les ensembles de nombres consécutifs de longueur 3 ou plus.

+0

Je n'ai pas compris ce que vous essayez de faire. Pourriez-vous fournir un exemple des données d'entrée et de la sortie attendue de l'algorithme? – Mathieu

+0

@Mathieu Salut, J'ai mis à jour le poste avec un exemple d'entrée et de sortie –

+0

Merci maintenant, c'est clair, je vais jeter un oeil. – Mathieu

Répondre

0

Ok, voici ma solution. L'idée est de trouver le premier et le dernier nombre d'ensembles consécutifs.

# -*-coding:Utf-8 -* 

data = [1, 4, 5, 6, 10, 15, 16, 17, 18, 22, 25, 26, 27, 28] 

from operator import itemgetter 
from itertools import groupby 

for k, g in groupby(enumerate(data), lambda ix : ix[0] - ix[1]): 
    group = list(map(itemgetter(1), g)) 
    print ((group[0], group[-1])) 

À ce stade, vous obtenez ceci:

(1, 1) 
(4, 6) 
(10, 10) 
(15, 18) 
(22, 22) 
(25, 28) 

Ensuite il vous suffit de sélectionner les bons, et de les garder (différence 2 ci-dessus). Vous pouvez également recréer la liste si nécessaire.

0

OP: Vous mentionnez 5 cartes, ce qui serait une 'main gardée' + entrée ou crèche + starter. Qu'en est-il quand il y en a plus? Plus précisément, The Play. À l'avenir, le même code devrait-il être utilisé à ces deux fins?

Imagine joueurs ont A-3-5-7 et 2-3-4-6

Le nombre maximum serait (1 + 3 + 5 + 7) + (2 + 3 + 4 + 6) => 31. Bien qu'il y ait un nombre fini de combinaisons et l'ordre dans lequel les cartes sont jouées, c'est un peu plus compliqué. BTW: comme un peu (jeu de mots) de Cribbage trivia, The Sting sera sur Flix (09/02) et Showtime (09/07). C'est l'un des rares endroits où vous verrez jouer Cribbage à l'écran.