Come lavorare con il tipo di dati dell'elenco Python

Python viene fornito con una raccolta di tipi di dati incorporati che semplificano le operazioni comuni di data wrangling. Tra questi c'è l'  elenco , un tipo di collezione semplice ma versatile. Con un elenco Python, puoi raggruppare oggetti Python insieme in una riga unidimensionale che consente di accedere agli oggetti per posizione, aggiunti, rimossi, ordinati e suddivisi.

Nozioni di base sugli elenchi di Python

Definire un elenco in Python è facile: basta usare la sintassi delle parentesi per indicare gli elementi in un elenco.

list_of_ints = [1, 2, 3]

Gli elementi di un elenco non devono nemmeno essere tutti dello stesso tipo. Possono essere qualsiasi oggetto Python. (Qui, supponi  Three sia una funzione.)

list_of_objects = ["Uno", DUE, Tre, {"Quattro": 4}, Nessuno]

Notare che avere oggetti misti in un elenco può avere implicazioni per l'ordinamento dell'elenco. Ne parleremo più tardi.

Il motivo principale per utilizzare un elenco è riuscire a trovare gli oggetti in base alla loro posizione nell'elenco. Per fare questo, usi la notazione indice di Python: un numero tra parentesi, che inizia da 0, che indica la posizione dell'elemento nell'elenco.

Per l'esempio precedente, list_of_ints[0]produce 1. list_of_ints[1]rendimenti 2. list_of_objects[4]sarebbe l'  None oggetto.

Indicizzazione di elenchi Python

Se utilizzi un numero intero positivo per l'indice, il numero intero indica la posizione dell'elemento da cercare. Ma se usi un   numero intero negativo , il numero intero indica la posizione a partire dalla  fine  dell'elenco. Ad esempio, l'utilizzo di un indice di -1è un modo pratico per afferrare l'ultimo elemento da un elenco, indipendentemente dalle dimensioni dell'elenco.

list_of_ints[-1] rendimenti  3list_of_objects[-1] rendimenti  None.

Puoi anche utilizzare una variabile intera come indice. If  x=0list_of_ints[x] restituisce 1 e così via.

Aggiunta e rimozione di elementi dell'elenco Python

Python ha diversi modi per aggiungere o rimuovere elementi da un elenco.

  • .append() inserisce un elemento alla  fine  della lista. Ad esempio, list_of_ints.append(4)si trasformerebbe  list_of_ints nella lista  [1,2,3,4]. Le aggiunte sono veloci ed efficienti; ci vuole circa la stessa quantità di tempo per aggiungere un elemento a un elenco, non importa quanto sia lungo l'elenco.
  • .pop() rimuove e restituisce l'ultimo elemento dall'elenco. Se eseguissimo  x = list_of_ints.pop() sull'originale  list_of_ints, x conterrebbe il valore  3. ( .pop() Tuttavia, non è necessario assegnare i risultati di  a un valore, se non ne hai bisogno.) Anche le  .pop()operazioni sono veloci ed efficienti.
  • .insert() inserisce un elemento in una posizione arbitraria nell'elenco. Ad esempio,  list_of_ints.insert(0,10) si trasformerebbe  list_of_intsin [10,1,2,3]. Nota che più ti avvicini all'inizio dell'elenco, più lenta sarà questa operazione, anche se non vedrai molto rallentamento a meno che la tua lista non abbia molte migliaia di elementi o tu stia facendo gli inserimenti in un ciclo stretto.
  • .pop(x) rimuove l'elemento dall'indice  x. Quindi  list_of_ints.pop(0) rimuoverebbe l'elemento all'indice 0. Ancora una volta, più sei vicino all'inizio dell'elenco, più lenta può essere questa operazione.
  • .remove(item) rimuove un elemento da un elenco, ma  non in  base al suo indice. Piuttosto, .remove()rimuove la  prima occorrenza  dell'oggetto specificato, cercando dall'inizio dell'elenco verso il basso. Infatti  [3,7,7,9,8].remove(7), il primo  7 verrebbe rimosso, risultando nell'elenco  [3,7,9,8]. Anche questa operazione può rallentare per una lista di grandi dimensioni, poiché teoricamente deve attraversare l'intera lista per funzionare.

Affettare un elenco Python

Gli elenchi possono essere suddivisi in nuovi elenchi, un processo chiamato  affettatura . La sintassi delle sezioni di Python consente di specificare quale parte di un elenco ritagliare e come manipolare la parte scolpita.

Hai visto sopra come utilizzare la notazione delle parentesi per ottenere un singolo elemento da un elenco:, my_list[2]ad esempio. Fette usano una variante dello stesso notazione indice (e seguendo le stesse regole di indicizzazione): list_object[start:stop:step].

  • start è la posizione nell'elenco da cui iniziare la sezione. 
  • stop è la posizione nell'elenco in cui interrompiamo il taglio. In altre parole,  quella posizione e tutto ciò che  segue viene omesso.
  • step è un indicatore opzionale "ogni ennesimo elemento" per la sezione. Per impostazione predefinita, questo è  1, quindi la fetta conserva tutti gli elementi dell'elenco da cui sta tagliando. Imposta stepsu  2e selezionerai ogni secondo elemento e così via.

Ecco alcuni esempi. Considera questo elenco:

slice_list = [1,2,3,4,5,6,7,8,9,0]

slice_list [0: 5] = [1, 2, 3, 4, 5]

(Nota che ci fermeremo all'indice 4, non all'indice 5!)

slice_list [0: 5: 2] = [1, 3, 5]

Se ometti un particolare indice di slice, Python assume un valore predefinito. Lascia fuori l'indice di inizio e Python assume l'inizio dell'elenco:

slice_list [: 5] = [1, 2, 3, 4, 5]

Lascia fuori l'indice di stop e Python assume la fine dell'elenco:

slice_list [4:] = [5, 6, 7, 8, 9, 0]

L'  step elemento può anche essere  negativo . Questo ci consente di prendere sezioni che sono copie invertite dell'originale:

slice_list [:: - 1] = [0, 9, 8, 7, 6, 5, 4, 3, 2, 1]

Nota che puoi tagliare al contrario utilizzando gli indici di inizio e fine che vanno all'indietro, non in avanti:

slice_list [5: 2: -1] = [6, 5, 4]

Inoltre, tieni presente che le sezioni di elenchi sono  copie  dell'elenco originale. L'elenco originale rimane invariato. 

[Anche su: I migliori corsi gratuiti di scienza dei dati durante la quarantena]

Ordinamento di un elenco Python

Python provides two ways to sort lists: You can generate a new, sorted list from the old one, or you can sort an existing list in-place. These options have different behaviors and different usage scenarios.

To create a new, sorted list, use the sorted() function on the old list:

new_list = sorted(old_list)

This will sort the contents of the list using Python’s default sorting methods. For strings, the default is alphabetical order; for numbers, it’s ascending values. Note that the contents of the list need to be consistent for this to work. For instance, you can’t sort a mix of integers and strings, but you can sort a list that is all integers or all strings. Otherwise you’ll get a TypeError in the sort operation.

If you want to sort a list in reverse, pass the reverse parameter:

new_list = sorted(old_list, reverse=True)

The other way to sort, in-place sorting, performs the sort operation directly on the original list. To do this, use the list’s .sort()method:

old_list.sort()

.sort() also takes reverse as a parameter, allowing you to sort in reverse.

Both sorted() and .sort() also take a key parameter. The key parameter lets you provide a function that can be used to perform a custom sorting operation. When the list is sorted, each element is passed to the key function, and the resulting value is used for sorting. For instance, if we had a mix of integers and strings, and we wanted to sort them, we could use key like this:

mixed_list = [1,"2",3,"4", None] def sort_mixed(item): try: return int(item) except: return 0 sorted_list = sorted(mixed_list, key = sort_mixed) print (sorted_list)

Note that this code wouldn’t convert each element of the list into an integer! Rather, it would use the integer value of each item as its sort value. Also note how we use a try/except block to trap any values that don’t translate cleanly into an integer, and return 0 for them by default.

Python lists are not arrays

One important thing to know about lists in Python is that they aren’t “arrays.” Other languages, like C, have one-dimensional or multi-dimensional constructions called arrays that accept values of a single type. Lists are heterogenous; they can accept objects of any type.

What’s more, there is a separate array type in Python. The Python array is designed to emulate the behavior of an array in C, and it’s meant chiefly to allow Python to work with C arrays. The array type is useful in those cases, but in almost every pure-Python case you’ll want to use lists.

When to use Python lists (and when not to)

So when are Python lists most useful? A list is best when:

  • You need to find things quickly by their position in a collection. Accessing any position in a list takes the same amount of time, so there is no performance penalty for looking up even the millionth item in a list.
  • You’re adding and removing to the collection mainly by appending to the end or removing from the end, in the manner of a stack. Again, these operations take the same amount of time regardless of the length of the list.

A Python list is less suitable when:

  • You want to find an item in a list, but you don’t know its position. You can do this with the .index() property. For instance, you could use list_of_ints.index(1) to find the index of the first occurrence of the number 1 in list_of_ints. Speed should not be not an issue if your list is only a few items long, but for lists thousands of items long, it means Python has to search the entire list. For a scenario like this, use a dictionary, where each item can be found using a key, and where the lookup time will be the same for each value.
  • You want to add or remove items from any position but the end. Each time you do this, Python must move every other item after the added or removed item. The longer the list, the greater the performance issue this becomes. Python’s deque object is a better fit if you want to add or remove objects freely from either the start or the end of the list.

How to do more with Python

  • How to package Python apps with BeeWare Briefcase
  • How to run Anaconda side by side with other Pythons
  • How to use Python dataclasses
  • Get started with async in Python
  • How to use asyncio in Python
  • 3 steps to a Python async overhaul
  • How to use PyInstaller to create Python executables
  • Cython tutorial: How to speed up Python
  • How to install Python the smart way
  • How to manage Python projects with Poetry
  • How to manage Python projects with Pipenv
  • Virtualenv e venv: spiegazione degli ambienti virtuali Python
  • Python virtualenv e venv cosa fare e cosa non fare
  • Spiegazione del threading e dei sottoprocessi di Python
  • Come utilizzare il debugger Python
  • Come usare timeit per profilare il codice Python
  • Come usare cProfile per profilare il codice Python
  • Come convertire Python in JavaScript (e viceversa)