Cómo trabajar con el tipo de datos de lista de Python

Python viene con una colección de tipos de datos integrados que facilitan las operaciones comunes de intercambio de datos. Entre ellos está la  lista , un tipo de colección simple pero versátil. Con una lista de Python, puede agrupar objetos de Python en una fila unidimensional que permite acceder a los objetos por posición, agregarlos, eliminarlos, ordenarlos y subdividirlos.

Conceptos básicos de la lista de Python

Definir una lista en Python es fácil: solo use la sintaxis de corchetes para indicar elementos en una lista.

list_of_ints = [1, 2, 3]

Los elementos de una lista tampoco tienen que ser del mismo tipo. Pueden ser cualquier objeto de Python. (Aquí, suponga que  Three es una función).

list_of_objects = ["Uno", DOS, Tres, {"Cuatro": 4}, Ninguno]

Tenga en cuenta que tener objetos mezclados en una lista puede tener implicaciones para ordenar la lista. Entraremos en esto más tarde.

La razón más importante para usar una lista es poder encontrar objetos por su posición en la lista. Para hacer esto, usa la notación de índice de Python: un número entre paréntesis, comenzando en 0, que indica la posición del elemento en la lista.

Para el ejemplo anterior, list_of_ints[0]cede 1. list_of_ints[1]rendimientos 2. list_of_objects[4]sería el  None objeto.

Indexación de listas de Python

Si usa un número entero positivo para el índice, el número entero indica la posición del elemento a buscar. Pero si usa un   número entero negativo , entonces el número entero indica la posición comenzando desde el  final  de la lista. Por ejemplo, usar un índice de -1es una forma práctica de tomar el último elemento de una lista sin importar el tamaño de la lista.

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

También puede utilizar una variable entera como índice. Si  x=0list_of_ints[x] produce 1, y así sucesivamente.

Agregar y eliminar elementos de la lista de Python

Python tiene varias formas de agregar o eliminar elementos de una lista.

  • .append() inserta un elemento al  final  de la lista. Por ejemplo, list_of_ints.append(4)se convertiría  list_of_ints en la lista  [1,2,3,4]. Los anexos son rápidos y eficientes; se necesita aproximadamente la misma cantidad de tiempo para agregar un elemento a una lista, sin importar cuán larga sea la lista.
  • .pop() elimina y devuelve el último elemento de la lista. Si ejecutamos  x = list_of_ints.pop() el original  list_of_ints, x contendría el valor  3. (Sin .pop() embargo, no tiene que asignar los resultados de  a un valor, si no lo necesita). Las  .pop()operaciones también son rápidas y eficientes.
  • .insert() inserta un elemento en alguna posición arbitraria en la lista. Por ejemplo,  list_of_ints.insert(0,10) se convertiría  list_of_intsen [10,1,2,3]. Tenga en cuenta que cuanto más cerca inserte al principio de la lista, más lenta será esta operación, aunque no verá mucha desaceleración a menos que su lista tenga muchos miles de elementos o que esté haciendo las inserciones en un bucle cerrado.
  • .pop(x) elimina el elemento del índice  x. Por list_of_ints.pop(0) lo tanto  , eliminaría el elemento en el índice 0. Nuevamente, cuanto más cerca esté del frente de la lista, más lenta puede ser esta operación.
  • .remove(item) elimina un elemento de una lista, pero  no en  función de su índice. Más bien, .remove()elimina la  primera aparición  del objeto que especifique, buscando desde la parte superior de la lista hacia abajo. Porque  [3,7,7,9,8].remove(7), el primero  7 se eliminaría, dando como resultado la lista  [3,7,9,8]. Esta operación también puede ralentizarse para una lista grande, ya que teóricamente tiene que recorrer toda la lista para funcionar.

Cortar una lista de Python

Las listas se pueden dividir en nuevas listas, un proceso llamado  división . La sintaxis de corte de Python le permite especificar qué parte de una lista tallar y cómo manipular la parte tallada.

Viste anteriormente cómo usar la notación entre corchetes para obtener un solo elemento de una lista:, my_list[2]por ejemplo. Rebanadas utilizan una variante de la misma notación de índice (y siguiendo las mismas reglas de indexación): list_object[start:stop:step].

  • start es la posición en la lista para iniciar el segmento. 
  • stop es la posición en la lista donde dejamos de cortar. En otras palabras,   se omite esa posición y todo lo que sigue.
  • step es un indicador opcional de "cada enésimo elemento" para el segmento. De forma predeterminada, esto es  1así, por lo que el segmento conserva todos los elementos de la lista de la que se está dividiendo. Configure stepen  2, y seleccionará cada segundo elemento, y así sucesivamente.

Aquí hay unos ejemplos. Considere esta lista:

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

lista de rebanadas [0: 5] = [1, 2, 3, 4, 5]

(¡Tenga en cuenta que nos detenemos en el índice 4, no en el índice 5!)

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

Si omite un índice de sector en particular, Python asume un valor predeterminado. Deje el índice de inicio y Python asume el inicio de la lista:

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

Deje el índice de detención y Python asume el final de la lista:

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

El  step elemento también puede ser  negativo . Esto nos permite tomar cortes que son copias invertidas del original:

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

Tenga en cuenta que puede dividir en reversa mediante el uso de índices de inicio y parada que van hacia atrás, no hacia adelante:

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

También tenga en cuenta que las porciones de listas son  copias  de la lista original. La lista original permanece sin cambios. 

[También en: Los mejores cursos gratuitos de ciencia de datos durante la cuarentena]

Ordenar una lista de Python

Python proporciona dos formas de ordenar listas: puede generar una nueva lista ordenada a partir de la anterior, o puede ordenar una lista existente en el lugar. Estas opciones tienen diferentes comportamientos y diferentes escenarios de uso.

Para crear una nueva lista ordenada, use la  sorted() función en la lista anterior:

new_list = ordenado (old_list)

Esto ordenará el contenido de la lista usando los métodos de clasificación predeterminados de Python. Para las cadenas, el valor predeterminado es el orden alfabético; para los números, son valores ascendentes. Tenga en cuenta que el contenido de la lista debe ser coherente para que esto funcione. Por ejemplo, no puede ordenar una combinación de números enteros y cadenas, pero puede ordenar una lista que contenga todos números enteros o cadenas. De lo contrario, obtendrá una  TypeError operación de clasificación.

Si desea ordenar una lista al revés, pase el  reverse parámetro:

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 y venv: explicación de los entornos virtuales de Python
  • Python virtualenv y venv qué hacer y qué no hacer
  • Explicación de subprocesos y subprocesos de Python
  • Cómo usar el depurador de Python
  • Cómo usar timeit para perfilar el código Python
  • Cómo usar cProfile para perfilar el código Python
  • Cómo convertir Python a JavaScript (y viceversa)