J'ai une liste complexe qui contient une autre liste. Chaque liste fait partie d'un ensemble (dans une autre partie du programme, elle lit 3 valeurs à la fois, si vous avez 2 charges de 3 valeurs, elle les définit chacune dans un seul ensemble. Ainsi, par exemple ci-dessous, mon premier ensemble d'entrées était:
SetHistory = [[[12, 11, 1], 1], [[12, 6, 2], 1], [[8, 7, 1], 1], [[6, 6, 1], 2]] for Results, Set_Number in SetHistory: UnpackResults = [Results] UnpackSet = [Set_Number] for i in UnpackSet: print(f'Starting with set {Set_Number}') for i, v, x in UnpackResults: print(f'The Following appear:{i},{v},{x} ')
puis mon deuxième ensemble d'entrées était:
Starting with set 1 The Following appear:12,11,1 Starting with set 1 The Following appear:12,6,2 Starting with set 1 The Following appear:8,7,1 Starting with set 2 The Following appear:6,6,1
Donc, effectivement, chaque entrée serait faire partie d'un ensemble:
Starting with set 1: 12, 11, 1 12, 6, 2 8, 7, 1 Starting with set 2: 6, 6, 1
Ceci est défini sur une variable "Historique" qui se souvient de tous les ensembles et de leurs entrées jusqu'à ce qu'ils soient effacés, stockés sous forme de [[inputs] setnumber] où l'élément externe est le numéro de l'ensemble et les éléments internes sont les entrées qui ont été reçues sur cet ensemble:
[[12, 11, 1], 1] [[12, 6, 2], 1] [[8, 7, 1], 1] [[6, 6, 1], 2]
Ce que je dois faire est de les imprimer dans un format de :
Set 1: 12, 11, 1 12, 6, 2 8, 7, 1 Set 2: 6, 6, 1
Au lieu de cela, ce que j'obtiens est:
6, 6, 1
Peu importe à quel point j'essaye ou combien de fois je joue autour avec quelques instructions if, while boucles (Celui-ci ne fait qu'empirer les choses) Je ne peux pas le faire se comporter comme je l'attends. Actuellement, mon code de base est ci-dessous.
Je suis tellement sûr qu'il me manque quelque chose de simple ou d'utiliser le mauvais type d'objet, mais pour la vie de moi, la solution m'a échappé et me rend fou.
12, 11, 1 12, 6, 2 8, 7, 1
4 Réponses :
Résolvons ceci en utilisant un dictionnaire.
SetHistory = [[[12, 11, 1], 1], [[12, 6, 2], 1], [[8, 7, 1], 1], [[6, 6, 1], 2]] set_dict = {} for Results, Set_Number in SetHistory: if Set_Number in set_dict: set_dict[Set_Number].append(Results) else: set_dict[Set_Number] = [Results] for a_set in sorted(set_dict): print('Set '+str(a_set)) for val_list in set_dict[a_set]: print(*val_list)
De cette façon, chaque entrée d'un dictionnaire est un nombre défini. Il contient une liste de listes pour ce numéro, vous savez donc quel est le numéro défini avant de traiter chaque liste.
Cela a fonctionné aussi et j'aurais vraiment dû penser à convertir en dictionnaire. Cela a beaucoup de sens. J'ai cependant beaucoup aimé la réponse de Georgy en utilisant itertools.groupby pour regrouper les ensembles. C'est petit et concis. Je souhaite cependant pouvoir définir 2 réponses
Vous pouvez utiliser itertools.groupby
pour regrouper les "entrées" par vos "ensembles" numéros comme ceci:
Starting with set 1: 12, 11, 1 12, 6, 2 8, 7, 1 Starting with set 2: 6, 6, 1
donne:
from itertools import groupby from operator import itemgetter set_history = [[[12, 11, 1], 1], [[12, 6, 2], 1], [[8, 7, 1], 1], [[6, 6, 1], 2]] for key, group in groupby(set_history, key=itemgetter(1)): print(f'Starting with set {key}:') for item in group: print(*item[0], sep=", ")
Cela a fonctionné comme un charme! Merci beaucoup. Cela a fonctionné exactement comme j'avais besoin et je peux encore décompresser les éléments du groupe pour jouer avec les résultats individuels dans chaque ensemble et sous-ensemble! Merci!
En utilisant votre approche, vous pouvez résoudre ce problème en stockant temporairement «l'ensemble» complet (c'est en fait une liste ici):
SetHistory = [[[12, 11, 1], 1], [[12, 6, 2], 1], [[8, 7, 1], 1], [[6, 6, 1], 2]] UnpackResults = [] Set_Number_old = 1 for Results, Set_Number in SetHistory: if Set_Number_old == Set_Number: UnpackResults.append(Results) else: print('Starting with set {}'.format(Set_Number_old)) for i, v, x in UnpackResults: print('The Following appear:{},{},{} '.format(i, v, x)) Set_Number_old = Set_Number UnpackResults = [Results] print('Starting with set {}'.format(Set_Number_old)) for i, v, x in UnpackResults: print('The Following appear:{},{},{} '.format(i, v, x))
Votre SetHistory
est en forme (4,2). dans pour les résultats, Set_Number dans SetHistory:
vous obtenez simplement le numéro de l'ensemble à chaque itération, puis vous l'imprimez immédiatement. En fait, vous voulez stocker tous les résultats correspondant à cet ensemble spécifique et l'imprimer une fois que vous arrivez à l'ensemble suivant.
Je recommande d'utiliser un dictionnaire ( https://docs.python.org /3/tutorial/datastructures.html?highlight=dictionary voir 5.5) pour votre cas.
Voici mon approche basée sur le dictionnaire:
d = dict() for res, n in SetHistory: d[n] = d.get(n, []) + [res] for k, v in d.items(): print(f'set {k}:') print(v) # set 1: # [[12, 11, 1], [12, 6, 2], [8, 7, 1]] # set 2: # [[6, 6, 1]]