2010-08-29 30 views
1

J'ai une liste qui est créé dans une opération itertools.groupby:Comment donner une liste pré-déballée?

def yield_unpacked_list(): 
    for key, grp in itertools.groupby(something_to_groupby, key=lambda x: x[0]): 
     subset_of_grp = list(item[2] for item in list(grp)) 
     yield key, subset_of_grp 

Si, par exemple, subset_of_grp se révèle être [1, 2, 3, 4] et [5, 6, 7, 8]:

for m in yield_unpacked_list(): 
    print m 

serait imprimer:

('first_key', [1, 2, 3, 4]) 
('second_key', [5, 6, 7, 8]) 

Maintenant, revenons à ma définition de fonction. Il est évident que ce qui suit est une erreur de syntaxe (l'opérateur *):

def yield_unpacked_list(): 
    for key, grp in itertools.groupby(something_to_groupby, key=lambda x: x[0]): 
     subset_of_grp = list(item[2] for item in list(grp)) 
     yield key, *subset_of_grp 

Je veux que le résultat suivant pour la mêmeprint boucle sans les [list] entre parenthèses:

('first_key', 1, 2, 3, 4) 
('second_key', 5, 6, 7, 8) 

Notez que print est seulement à des fins d'illustration ici. J'ai d'autres fonctions qui bénéficieraient de la structure simplifiée tuple.

Répondre

5

yield (key,) + tuple(subset_of_grp)

2
def yield_unpacked_list(): 
    for key, grp in itertools.groupby(something_to_groupby, key=lambda x: x[0]): 
     yield (key,) + tuple(item[2] for item in grp) 

A partir du résultat que vous voulez pour l'impression, il est clair que vous voulez donner un tuple - aucune idée pourquoi vous appelez une « liste déballés » au lieu, mais, de toute façon, il vous sont. J'ai également supprimé quelques appels à list qui ne servaient simplement à aucun rôle utile dans votre code.