Forum >> Principianti >> LISTE DI LISTE

Pagina: 1

Messaggio annotato da Daniele aka Palmux :
Questa discussione è stata spostata dalla categoria Database.
Salve ho un problema e non riesco in nessun modo a risolverlo. Il mio obiettivo è questo:
Ho una lista P=['a', 'b',['c','d']], in output dovrebbe venire fuori 'abc' e 'abd', cioè unire le prime due lettere a cui va aggiunta una terza dalla lista, ho provato a farlo in moltissimi modi, ma non riesco a risolverlo, qualcuno può aiutarmi?

P=['a', 'b', ['c','d']]


for i in range (len(P)):

parola=''

lista=[]

if type(P)== str :

parola="".join(P)

if type(P)==list:

for j in range(len(P)):

nuovo=parola+P[ij]

lista.append(nuovo)

print(lista)

Ciao caro, se ti posto una cosa del genere ti piace e la capisci?
>>> from itertools import chain
>>> from functools import reduce
>>> mylist = [str(reduce(lambda a,b: a+b, [i for i in P if not isinstance(i, list)])) + str(i) for i in list(chain.from_iterable([i for i in P if isinstance(i, list)]))]
['abc', 'abd']
Lo so, ho tirato via, ma adesso torniamo a ritroso tranquillo.

A. Prima isolo la sublist che dovrà essere "ciclata" per aggiungere le altre lettere della tua lista, due, tre, mille, non importa il numero di quello che hai prima della lista annidata e quello che hai dentro. Forse capirai tutto senza problemi, tranne chain.from_iterable [link] che non fa nulla di complicato, accetta un singolo iterabile come argomento e li restituisce in un iterabile piatto (flat) contenente tutti gli elementi dell'iterabile in ingresso. Forse ti potrebbe essere ostico anche isinstance(i, list) [link], ma questo si spiega facilmente dal link che ti ho dato, controlla di fatto che tipo di oggetto stai trattando:
>>> list(chain.from_iterable([i for i in P if isinstance(i, list)]
['c', 'd']


B. Ora che abbiamo spiegato la seconda parte, quella con cui parte il calcolo, prendiamo grazie a reduce() e lambda() la somma dei valori contenuti prima della sublist, e visto che vogliamo manipolare stringhe, in queste caso questo produrrà:
>>> str(reduce(lambda a,b: a+b, [i for i in P if not isinstance(i, list)]))
'ab'


C. Bene siamo alla fine, uniamo il tutto ed abbiamo il risultato cercato/voluto/sperato. Quel '+ str(i) for i in list(... ' non fa altro che accogliere l'output di A e unirlo a B.

Bene ora credo si tutto più chiaro, se vuoi renderlo più semplice ti do un compito per casa, trasforma quanto ti ho scritto in "semplici" strumenti di controllo di flusso (if, for, ...) e posta il risultato, sarà più prolisso ma ugualmente soddisfacente.

Cya e buon anno.






Pagina: 1



Esegui il login per scrivere una risposta.