You are here: Partenza > Dive Into Python > Programmazione orientata ai dati > Rivisitazione della mappatura delle liste | << >> | ||||
Dive Into PythonPython per programmatori esperti |
Siete già abituati ad usare la list comprehensions per mappare una lista in un altra. C'è un altro modo per fare la stessa cosa, usando la funzione built-in map. Funziona in modo molto simile alla funzione filter.
>>> def double(n): ... return n*2 ... >>> li = [1, 2, 3, 5, 9, 10, 256, -3] >>> map(double, li) [2, 4, 6, 10, 18, 20, 512, -6] >>> [double(n) for n in li] [2, 4, 6, 10, 18, 20, 512, -6] >>> newlist = [] >>> for n in li: ... newlist.append(double(n)) ... >>> newlist [2, 4, 6, 10, 18, 20, 512, -6]
map richiede una funzione ed una lista [15] e restituisce una nuova lista chiamando la funzione ed ordinandola per ogni elemento della lista. In questo caso la funzione moltiplica semplicemente ogni elemento per 2. | |
Potreste arrivare allo stesso risultato con una list comprehension. La list comprehension è stata introdotta in Python 2.0; map esiste da sempre. | |
Potreste, se insistete a pensare come un programmatore di Visual Basic, usare un ciclo for per fare lo stesso lavoro. |
>>> li = [5, 'a', (2, 'b')] >>> map(double, li) [10, 'aa', (2, 'b', 2, 'b')]
Bene, abbiamo giocato abbastanza. Diamo un'occhiata ad un po' di codice vero.
filenameToModuleName = lambda f: os.path.splitext(f)[0] moduleNames = map(filenameToModuleName, files)
Come abbiamo visto nella sezione Usare le funzioni lambda, lambda definisce una funzione inline. Come abbiamo visto nell'Esempio 4.36, “Dividere i pathnames”, os.path.splitext riceve come parametro un nome di file e restituisce una tupla (nome, estensione). Quindi filenameToModuleName è una funzione che riceverà un nome di file, toglierà l'estensione e ne restituirà solamente il nome. | |
Chiama map per ogni nome di file elencato in files, passa il nome-file alla nostra funzione filenameToModuleName e restituisce una lista di valori risultante da ogni chiamata della funzione. In altre parole, eliminiamo l'estensione di ogni nome di file e conserviamo la lista di tutte queste parti di nomi in moduleNames. |
Come vedremo nel resto del capitolo, possiamo estendere questo atteggiamento di pensiero data-centrico adattandolo al nostro scopo, che in definitiva è eseguire un singolo test che contenga tutti quei singoli test che ci servono.
[15] Ancora, devo sottolineare che map può ricevere una lista, una tupla, o un qualsiasi oggetto simile ad una sequenza. Controllate la nota precedente riguardo a filter.
<< Filtrare liste rivisitate |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
Programmazione data-centrica >> |