Domanda

Ho una lista che si crea all'interno di un'operazione itertools.groupby:

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

Se, ad esempio, subset_of_grp risulta essere [1, 2, 3, 4] e [5, 6, 7, 8]:

for m in yield_unpacked_list():
    print m

sarebbe stampare:

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

Ora, tornando alla mia definizione di funzione. Ovviamente il seguente è un errore di sintassi (l'operatore *):

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

Voglio il seguente risultato per la stesso ciclo print di essere senza le parentesi [list]:

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

Si noti che print è solo a scopo illustrativo qui. Ho altre funzioni che potrebbero trarre beneficio dalla struttura tuple semplificata.

È stato utile?

Soluzione

yield (key,) + tuple(subset_of_grp)

Altri suggerimenti

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)

Dal risultato che si desidera per la stampa, è chiaro che si vuole produrre un tuple - nessuna idea perché si chiama una "lista spacchettato", invece, ma, in ogni caso, ci siete. Ho anche tolto un paio di chiamate a list che semplicemente servito alcun ruolo utile a tutti nel codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top