Programación Python - lista

I. Introducción

Punto clave: una lista puede almacenar una colección de datos de cualquier tamaño.

        Los programas generalmente necesitan almacenar una gran cantidad de valores. Supongamos, por ejemplo, que necesita leer 100 números, calcular su promedio y luego encontrar cuántos números están por encima de este promedio. El programa primero lee 100 números y calcula su promedio, luego compara cada número con el promedio para determinar si excede el promedio. Para realizar esta tarea, estos números deben almacenarse en variables. Para hacer esto, debes crear 100 variables y escribir casi el mismo código 100 veces. Obviamente, escribir un programa de este tipo no es práctico. Entonces, ¿cómo solucionar este problema?

        Necesitamos un enfoque eficiente y organizado. Python proporciona un tipo de datos llamado lista, que puede almacenar una colección ordenada de elementos.

2. Enumerar conceptos básicos

Punto clave: una lista es una secuencia definida utilizando la clase de lista, que incluye métodos para crear, manipular y procesar listas. Se puede acceder a los elementos de la lista a través de subíndices.

2.1 Crear una lista

La clase de lista define listas. Para crear una lista, utilice el constructor de listas de la siguiente manera:

list1 = list() # Create an empty list
list2 = list([2,3,4]) # Create a list with elements 2,3,4
list3 = list(["red", "green", "blue"]) # Create a Tist with strings
list4 = list(range(3, 6)) # Create a list with elements 3, 4,5
list5 = list("abcd") # Create a list with characters a,b,C,d

También puede crear una lista utilizando la siguiente sintaxis más simple:

listl = [] # Same as 1ist()
list2 = [2,3,4] # Same as list([2,3,4])
list3 = ["red", "green"] # Same as list(["red", "green"])

Los elementos de la lista están separados por comas y encerrados por un par de corchetes ([ ]) .

Nota: Una lista puede contener elementos del mismo tipo o elementos de diferentes tipos. Por ejemplo, también es posible la siguiente lista:

list4 =[2, "three", 4]

2.2 Una lista es un tipo de secuencia

        Tanto las cadenas como las listas en Python son tipos de secuencia. Una cadena es una secuencia de caracteres, mientras que una lista es una secuencia de cualquier elemento. Las operaciones comunes en secuencias se resumen en la Tabla 10-1. Las operaciones de secuencia en cadenas también funcionan en listas.

2.3 Funciones utilizadas por las listas

        Algunas funciones integradas de Python se pueden utilizar con listas. Puede usar la función len para devolver el número de elementos de la lista, la función max/min para devolver los elementos máximo y mínimo de la lista y la función sum para devolver la suma de todos los elementos de la lista. También puede utilizar la función aleatoria en el módulo aleatorio para organizar aleatoriamente los elementos de la lista. Aquí hay unos ejemplos:

>>> list1 = [2, 3,4,1,32]
>>> len(list1)
5
>>> max(list1)
32
>>> min(list1)
1
>>> sum(list1)
42
>>> import random
>>> random.shuffle(list1) # Shuffle the elements in 1ist1
>>> list1
[4,1,2,32,3]
>>>

2.4 Operador de subíndice [ ]

Se puede acceder a los elementos de una lista mediante el operador de subíndice utilizando la siguiente sintaxis:

myList[index]

El subíndice de la lista se basa en 0, es decir, el subíndice varía de 0 a len(myList)-1, como se ilustra en la Figura 10-1: myList[index] se puede usar como una variable, por lo que también se llama la siguiente variable de marca. Por ejemplo: el siguiente código agrega los valores en myList[0] y myList[1] y los asigna a myList[2].

myList[2] = myList[0] + myList[1]

El siguiente bucle asigna 0 a miLista[0], 1 a miLista[1], ..., 9 a miLista[9]:

Advertencia: Acceder a una lista fuera de límites es un error de programación común que resulta en un "IndexError" en tiempo de ejecución. Para evitar este error, asegúrese de no utilizar subíndices más allá de len(myList)-1.

2.5 Intercepción de listas[inicio:fin]

        El operador de subíndice permite la selección de un elemento en una posición de subíndice especificada. La operación de interceptación utiliza la sintaxis list[start:end] para devolver un fragmento de la lista. Este fragmento es una sublista que consta de elementos con índices desde el principio hasta el final-1. Aquí hay unos ejemplos:

>>> list1=[2,3,5,7,9,1]
>>> list1[2 : 4]
[5, 7]
>>>

Se pueden omitir el subíndice inicial y el subíndice final. En este caso, el índice inicial es 0 y el índice final es el último índice.

Nota: si inicio>=fin, entonces lista[inicio:fin] devolverá una lista vacía. Si end especifica una posición más allá del final de la lista, Python usará la longitud de la lista en lugar de end.

2.6 +, * y en/no en operadores

        Se pueden combinar dos listas usando el operador de concatenación (+) y los elementos de las listas se pueden copiar usando el operador de copia (*). Aquí hay unos ejemplos:

>>> list1 = [2,3]
>>> 1ist2
[1,9]
>>> list3 = 1ist1 + 1ist2
>>> 1ist3
[2, 3,1,9]
>>>
>>> list4 = 3 * list1
>>> list4
[2, 3,2,3,2,3]
>>>

        Al concatenar lista1 y lista2 se obtendrá una nueva lista (línea 3). La línea 7 copia list1 tres veces para crear una nueva lista. Nota: 3*lista1 es lo mismo que lista1*3.

        Puede utilizar los operadores in o not in para determinar si un elemento está en la lista. Por ejemplo:

>>> list1 = [2,3,5,2,33, 21]
>>> 2 in listl
True
>>> 2 not in list1
False
>>>

2.7 Usar bucle for para atravesar elementos

        Los elementos de una lista de Python son iterables. Python admite un bucle for conveniente que le permite iterar secuencialmente a través de una lista sin usar variables de subíndice. Por ejemplo, el siguiente código muestra todos los elementos de la lista mylist.

for u in myList:
    print(u)

El código se puede leer así: "Para cada elemento u en mylist, envíelo."
        Si desea recorrer la lista en un orden diferente o cambiar los elementos de la lista, aún debe usar variables de subíndice.
Por ejemplo, el siguiente código muestra elementos en posiciones impares.

for i in range(0, len(myList), 2):
    print(myList[i])

2.8 Lista de comparación

        Las listas se pueden comparar utilizando operadores de comparación (>, >=, <, <=, ==, !=). Para poder ser comparadas, ambas listas deben contener elementos del mismo tipo. La comparación utiliza el orden del diccionario: primero compare los dos primeros elementos y, si son diferentes, se determina el resultado de la comparación; si son iguales, continúe comparando los dos elementos siguientes y repita este proceso hasta que todos los elementos sean iguales. comparado. Aquí hay unos ejemplos.

>>> listl = ["green", "red", "blue"]
>>> list2 = ["red", "blue", "green"]
>>> list2 == listl
False
>>> list2 != list1
True
>>> list2 >= listl
True
>>> list2 > list1
True
>>> list2 < list1
False
>>> list2 <= listl
False
>>>

2.9 Análisis de listas

        Las listas por comprensión proporcionan una forma compacta de crear listas de elementos secuenciales. Una lista por comprensión consta de corchetes que contienen una expresión seguida de una cláusula for, seguida de cero o más cláusulas for o if. Las listas por comprensión producen una lista de los resultados de una evaluación de expresiones. Aquí hay unos ejemplos.

>>> list1 = [ x for x in range(5)] #Returnsalistof0,1,2,3,4
>>> list1
[0,1,2,3,4]
>>>
>>> list2 = [0.5 * x for x in list1]
>>> list2
[0.0,0.5,1.0,1.5,2.0]
>>>
>>> list3 = [x for x in list2 if x < 1.5]
>>> list3
[0.0, 0.5,1.0]
>>>

2.10 Métodos de lista

Una vez creada la lista, puede utilizar los métodos de la clase de lista (que se muestran en la Figura 10-2) para manipular la lista.

2.11 Dividir cadenas en listas

        La clase str incluye el método split, que es útil para dividir elementos de una cadena en listas. Por ejemplo, la siguiente declaración:

items = "Jane John Peter Susan".split()

        separaría la cadena "Jane John Peter Susan" en la lista ['Jane', 'John', 'Peter', 'Susan']. En este caso, las entradas de la cadena están separadas por espacios. Se puede utilizar un calificador no espacial. Por ejemplo, la siguiente declaración:

items = "09/20/2012".split("/")

La cadena "20/09/2012" se divide en la lista ['09', '20', '2012'].

Nota: Python admite expresiones regulares, una de las funciones más eficientes y potentes para unir y separar cadenas mediante patrones. Las expresiones regulares son complejas para los principiantes.

2.12 Lista de entrada

        Es posible que a menudo necesites escribir código para leer datos de la consola en una lista. Puede ingresar una entrada de datos por línea en el bucle y agregarla a la lista. Por ejemplo: el siguiente código lee 10 números en una lista, un número por línea.

lst = [] # Create a list
print("Enter 10 numbers: ")
for i in range(10) :
    lst.append(eval(input())

        A veces es más conveniente separar los datos en una línea con espacios. Los datos se pueden extraer de una línea de entrada utilizando el método de división de una cadena. Por ejemplo: el siguiente código lee 10 números separados por espacios de la línea - en una lista.

# Read numbers as a string from the console,
s = input("Enter 10 numbers separated by spaces from one line: ")
items = s.split() # Extract items from the string
lst = [eval(x) for x in items] # Convert items to numbers

        Llame a input() para leer una cadena. Utilice s.split() para extraer las entradas separadas por espacios en la cadena sy devolver
las entradas en una lista. La última línea crea una lista de números al convertir las entradas en números.

2.13 Listas de cambios

        A veces, es necesario mover elementos de una lista hacia la izquierda o hacia la derecha. Python no proporciona dicho método en la clase de lista, pero puede escribir la siguiente función para desplazarse hacia la izquierda.

2.14 Simplificar el código

        Las listas pueden simplificar enormemente ciertas tareas. Por ejemplo: supongamos que desea obtener el nombre en inglés del mes a través de un número de mes determinado. Si los nombres de los meses se almacenan en una lista, se puede acceder al nombre de un mes determinado simplemente mediante un subíndice. El siguiente código solicita al usuario el número de mes y luego muestra el nombre de su mes:

months = ["January", "February", "March", ...., "December"]
monthNumber = eval(input("Enter a month number (1 to 12): "))
print("The month is", months [monthNumber - 1])

        Sin usar la lista de meses, tendría que usar una declaración if-else larga y múltiple para determinar el nombre del mes, como esta:

if monthNumber == 0:
    print("The month is January")
elif monthNumber == 1:
    print("The month is February")
else:
    print("The month is December")

3. Copia la lista

Punto clave: para copiar datos de una lista a otra, los elementos se deben copiar de la lista de origen a la lista de destino uno por uno.

        A menudo es necesario copiar una lista o parte de una lista en un programa. En algunos casos, se podría intentar utilizar una declaración de asignación (=), como esta:

list2 = list1

        Sin embargo, esta declaración no copia el contenido de la lista a la que hace referencia listl1 a list2; de hecho, solo asigna el valor al que hace referencia list1 a list2. Después de esta declaración, tanto list1 como list2 apuntarán a la misma lista, como se muestra en la Figura 10-7. Ya no se hará referencia a la lista a la que apunta list2 y se convertirá en basura. El compilador de Python recopilará y reutilizará automáticamente el espacio de memoria ocupado por list2.

Para copiar listl exactamente a list2, puede usar:

list2 = [x for x in list1]

O simplificado a:

list2 = [] + list1

4. Pasar la lista a la función.

Punto clave: cuando se pasa una lista a una función, dado que la lista es un objeto mutable, el contenido de la lista puede cambiar después de la llamada a la función.

        Como una lista es un objeto, pasar una lista a una función es como pasar un objeto a la función. Por ejemplo: la siguiente función muestra los elementos en una lista.

def printList(lst) :
    for element in 1st:
        print(e1 ement)

Se puede llamar pasando una lista. Por ejemplo: la siguiente declaración llama a la función printlist para mostrar 3, 1, 2, 6, 4 y 2.

printList([3,1,2,6,4,2])

Nota: La declaración anterior crea una lista y luego la pasa a la función. La variable de referencia que apunta a la lista no se muestra aquí. Estas listas se denominan listas anónimas.

        Debido a que las listas son objetos mutables, el contenido de la lista puede cambiar dentro de la función.

5. Devolver una lista de una función

Punto clave: cuando una función devuelve una lista, se devuelve una referencia a la lista.

        Los parámetros de lista se pueden pasar al llamar a la función. Las funciones también pueden devolver listas. Por ejemplo: la siguiente función devuelve una lista que es la inversión de otra lista.

        La línea 2 crea un nuevo resultado de lista. Las líneas 4 a 5 copian los elementos de la lista denominada lst a la lista denominada resultado. La línea 7 devuelve esta lista. Por ejemplo: la siguiente declaración devuelve una nueva lista list2 con los elementos 6, 5, 4, 3, 2 y 1.

list1=[1,2,3,4,5,6]
list2 = reverse(list1)

Nota: La clase de lista tiene un método inverso(), al que se puede llamar para invertir una lista.

6. Lista de búsqueda

Punto clave: si una lista está ordenada, para encontrar un elemento en una lista, la búsqueda binaria es más eficiente que la búsqueda lineal.

        La búsqueda es un método para encontrar un elemento específico en una lista. Por ejemplo: determinar si una determinada puntuación está incluida en una lista de puntuaciones. La clase de lista proporciona el método de índice para buscar y devolver el índice de un elemento en la lista coincidente. También admite operadores in y not in para determinar si un elemento está en la lista.

6.1 Método de búsqueda lineal

        El método de búsqueda lineal compara secuencialmente la clave del elemento clave con cada elemento de la lista. Lo hace continuamente hasta que la palabra clave coincide con un elemento de la lista, o se ha buscado en toda la lista si no se encuentra ningún elemento coincidente. Si se encuentra un elemento coincidente, la búsqueda lineal devuelve el índice del elemento coincidente en la lista. Si no hay ninguna coincidencia, la búsqueda devuelve -1. La función linearSearch del Listado 10-9 ilustra este enfoque.

        Para comprender mejor esta función, rastree el programa utilizando las siguientes declaraciones.

lst = [1,4,4,2,5,-3,6,2]
i = linearSearch(1st, 4) # Returns 1
j = linearSearch(1st,-4) # Returns -1
k = linearSearch(1st, -3) # Returns 5

        La función de búsqueda lineal compara la clave con cada elemento de la lista. Estos elementos pueden estar en cualquier orden. Si estos elementos están presentes, entonces el algoritmo necesita detectar en promedio la mitad de los elementos de la lista antes de encontrar esta palabra clave. Debido a que el tiempo de ejecución de la búsqueda lineal es proporcional al número de elementos de la lista, la búsqueda lineal es ineficiente para listas grandes.

6.2 Método de búsqueda binaria

La búsqueda binaria es otro método común para buscar valores de lista. Para utilizar el método de búsqueda binaria, los elementos de la lista deben ordenarse de antemano. Suponiendo que la lista está organizada en orden ascendente, el método de búsqueda binaria primero comparará la palabra clave con el elemento central de la lista. En este momento, se deben considerar las siguientes tres situaciones.

  • Si la clave es más pequeña que el elemento central de la lista, entonces solo necesita continuar buscando la clave en la primera mitad de la lista.
  • Si la clave es igual al elemento central de la lista, la búsqueda finaliza porque se encuentra una coincidencia.
  • Si la palabra clave es mayor que el elemento en el medio de la lista, simplemente continúe buscando la palabra clave en la segunda mitad de la lista.

        Nota: No hace falta decir que la búsqueda binaria elimina la mitad de la lista después de cada comparación. A veces se excluye la mitad de los elementos, a veces se excluye la mitad más un elemento. Supongamos que esta lista tiene n elementos. Por conveniencia, supongamos que n es una potencia de 2. Después de la primera comparación, quedan n/2 elementos para la siguiente comparación; después de la segunda comparación, quedan (n/2) /2 elementos. Después de la k-ésima comparación, quedan n/2 k-ésimos elementos de potencia para la siguiente búsqueda. Cuando k=log2n, sólo queda un elemento en la lista y sólo se necesita una comparación. Por lo tanto, cuando se utiliza la búsqueda binaria, en el peor de los casos se requieren comparaciones log2n+1 para encontrar ese elemento en la lista ordenada. Para una lista con 1024 (29) elementos, una búsqueda binaria solo requiere 11 comparaciones en el peor de los casos, mientras que una búsqueda lineal requiere 1023 comparaciones.

        Después de cada comparación, la parte que se buscará en la lista se reduce a la mitad, y los subíndices bajo y alto se utilizan para representar el primer y último subíndice que se encuentra actualmente en la lista. Inicialmente, el valor bajo es 0 y el valor alto es len(lst)-1. mid representa el subíndice del elemento medio, por lo que mid es (bajo + alto) / 2. La Figura 10-9 muestra cómo usar la búsqueda binaria para buscar en la lista [2,4,7,10,11,45,50, 59,60, la palabra clave 11 se encontró en 66,69,70,79].

        Ahora ya sabes cómo funciona la búsqueda binaria. La siguiente tarea es cómo implementarlo en Python. Pero no se apresure a lograrlo de una vez. Debe desarrollarse gradualmente, paso a paso. Como se muestra en la Figura 10-10a, puede comenzar con la primera iteración de la búsqueda. Compara la clave con el elemento medio de la lista, donde bajo es 0 y alto es len(lst)-1. Si key<lst[mid], apunte el subíndice alto a mid-1; si key==lst[mid], se encuentra un objeto coincidente y el programa regresará a mid; si key>lst[mid], apunte el bajo subíndice de Puntos hasta mid+1.

        A continuación, considere agregar un bucle para implementar la función para completar la búsqueda de duplicados, como se muestra en la Figura 10-10b. Cuando se encuentra esta palabra clave, o cuando no se ha encontrado bajo>alto, la búsqueda finaliza.

        Cuando no se encuentra la palabra clave, el punto de inserción en el que se debe insertar la palabra clave es bajo para preservar el orden de la lista. Devolver el punto de inserción es más útil que devolver -1. Esta función debe devolver un valor negativo para indicar que la palabra clave no está en la lista. ¿Podemos simplemente devolver -low? No, porque la clave es menor que lst[0]. Una buena opción es que la función devuelva -low-1 si la palabra clave no está en la lista. Devolver -low-1 no solo indica que el valor no está en la lista, sino que también indica dónde se debe insertar el valor.

Nota: Las búsquedas lineales son útiles para encontrar elementos en una lista pequeña o en una cola sin ordenar, pero son ineficientes para listas grandes, mientras que las búsquedas binarias son más eficientes, pero requieren que la lista esté ordenada de antemano.

7. Lista ordenada

Punto clave: existen muchas estrategias para ordenar los elementos de la lista. La clasificación por selección y la clasificación por inserción son dos métodos comúnmente utilizados.

        Al igual que buscar, ordenar es una tarea común en programación. La lista de clases proporciona el método de clasificación para ordenar una lista.

        Se han desarrollado muchos algoritmos de clasificación. A continuación se presentan dos algoritmos de clasificación simples e intuitivos: clasificación por selección y clasificación por inserción. Al utilizar estos algoritmos, puede aprender técnicas valiosas para desarrollar e implementar otros algoritmos.

7.1 Clasificación de selección

        Supongamos que desea ordenar una lista en orden ascendente. La ordenación por selección encuentra el elemento más pequeño de la lista y lo intercambia con el primer elemento. Luego busque el elemento con el valor más pequeño entre los elementos restantes e intercámbielo con el primer elemento de la lista restante, y así sucesivamente hasta que solo quede un elemento. La Figura 10-11 muestra cómo utilizar la clasificación por selección para ordenar la lista [2,9,5,4,8,1,6].

        Desarrollar un programa de clasificación completo puede resultar difícil en el primer intento. Escribe un fragmento de código que complete la primera iteración. Encuentra el elemento más pequeño de la lista y lo intercambia con el primer elemento de la lista. Luego observa la diferencia en la segunda iteración, luego en la tercera iteración, y así sucesivamente. Observar esto le permitirá escribir un bucle que se generalice a todas las iteraciones.

7.2 Clasificación por inserción

        Supongamos que desea ordenar una lista en orden ascendente. El algoritmo de ordenación por inserción funciona insertando repetidamente un nuevo elemento en una sublista ya ordenada hasta que se ordena toda la lista. La Figura 10-12 muestra cómo utilizar la ordenación por inserción para ordenar la lista [2,9,5,4,8,1,6].

 8. Resumen

  • Puede utilizar las funciones len, max, min y sum integradas de Python para devolver la longitud de una lista, los valores máximo y mínimo de la lista y la suma de todos los elementos de la lista.
  • Puede utilizar la función aleatoria en el módulo aleatorio para mezclar los elementos de una lista.
  • Puede utilizar el operador de subíndice [] para hacer referencia a un elemento individual en una lista.
  • Los programadores suelen utilizar erróneamente el subíndice 1 para referirse al primer elemento de una lista, cuando debería ser 0. Esto se llama error de subíndice 1.
  • Puede utilizar el operador de concatenación + para unir dos listas, el operador de copia * para copiar elementos, el operador de interceptación [:] para obtener una sublista y los operadores in y not in para comprobar si un elemento está en la lista.
  • Puede utilizar un bucle for para recorrer todos los elementos de una lista.
  • Puede utilizar operadores de comparación para comparar elementos en dos listas.
  • Un objeto de lista es mutable. Puede agregar elementos y eliminar elementos de una lista utilizando los métodos agregar, extender, insertar, resaltar y eliminar.
  • Puede utilizar el método index para obtener el subíndice de un elemento de la lista y el método count para devolver el número de elementos de la lista.
  • Puede utilizar los métodos de clasificación e inversión para ordenar e invertir elementos en una lista.
  • Puede utilizar el método de división para dividir una cadena en una lista.
  • Cuando se llama a una función con un parámetro de lista, se pasa una referencia a la lista a la función.
  • Si una lista está ordenada, la búsqueda binaria es más eficiente que la búsqueda lineal cuando se busca un elemento en la lista.
  • La ordenación por selección intercambia el elemento más pequeño con el primer elemento de la lista. Luego busque el más pequeño de los elementos restantes y cámbielo por el primero de los elementos restantes, y así sucesivamente hasta que solo quede un elemento.
  • El algoritmo de ordenación por inserción inserta repetidamente un nuevo elemento en una sublista ordenada hasta que se ordena toda la lista.

おすすめ

転載: blog.csdn.net/java_faep/article/details/132311088