Domanda

Ho il seguente codice che uso per mappare un elenco nidificato in Python per produrre un elenco con la stessa struttura.

>>> nested_list = [['Hello', 'World'], ['Goodbye', 'World']]
>>> [map(str.upper, x) for x in nested_list]
[['HELLO', 'WORLD'], ['GOODBYE', 'WORLD']]

Può questo essere fatto con la lista solo di comprensione (senza utilizzare la funzione di mappa)?

È stato utile?

Soluzione

Per le liste nidificate è possibile utilizzare list comprehension nidificate:

nested_list = [[s.upper() for s in xs] for xs in nested_list]

Personalmente trovo map per essere più pulita in questa situazione, anche se io preferisco quasi sempre list comprehension. Quindi è davvero la vostra chiamata, dal momento che sia funzionerà.

Altri suggerimenti

Ricordate la Zen di Python:

  

Non è in genere più di uno - e, probabilmente, alcuni - modi ovvi per farlo **

.

** Nota:. A cura per la precisione

In ogni caso, preferisco mappa.

from functools import partial
nested_list = map( partial(map, str.upper), nested_list )

Map è certamente un modo molto più pulito di fare ciò che si vuole. È possibile nidificare le list comprehension, però, forse è quello che stai dopo?

[[ix.upper() for ix in x] for x in nested_list]

Ecco la soluzione per nidificato che ha profondità arbitraria :

def map_nlist(nlist=nlist,fun=lambda x: x*2):
    new_list=[]
    for i in range(len(nlist)):
        if isinstance(nlist[i],list):
            new_list += [map_nlist(nlist[i],fun)]
        else:
            new_list += [fun(nlist[i])]
    return new_list

si desidera maiuscolo tutto quello che lista degli elementi, basta digitare

In [26]: nested_list = [['Hello', 'World'], ['Goodbye', [['World']]]]
In [27]: map_nlist(nested_list,fun=str.upper)
Out[27]: [['HELLO', 'WORLD'], ['GOODBYE', [['WORLD']]]]

E ancora più importante, questa funzione ricorsiva può fare più di questo!

Sono nuovo di python, sentirsi liberi di discutere!

altri utenti hanno dato la risposta, ma ogni volta che sto avendo problemi confezionamento mia testa intorno a un costrutto funzionale, ho ingoiare il mio orgoglio e magia fuori longhand con metodi e / o gli oggetti in modo esplicito non ottimali. Hai detto che volevi finire con un generatore, in questo modo:

for xs in n_l:
    def doUpper(l):
        for x in l:
            yield x.upper()
    yield doUpper(xs)

for xs in n_l:
    yield (x.upper() for x in xs)

((x.upper() for x in xs) for xs in n_l)

A volte è più pulita per mantenere una delle versioni esteso. Per me, mappa e riducono talvolta renderla più evidente, ma idiomi Python potrebbe essere più evidente per gli altri.

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