| You are here: Inicio > Inmersión en Python > Tipos de dato nativos > Presentación de las listas | << >> | ||||
Inmersión en PythonPython de novato a experto |
|||||
Las listas son el caballo de tiro de Python. Si su única experiencia con listas son los array de Visual Basic o (dios no lo quiera) los datastore de Powerbuilder, prepárese para las listas de Python.
| Una lista de Python es como un array en Perl. En Perl, las variables que almacenan arrays siempre empiezan con el carácter @; en Python, las variables se pueden llamar de cualquier manera, y Python se ocupa de saber el tipo que tienen. | |
| Una lista en Python es mucho más que un array en Java (aunque puede usarse como uno si es realmente eso todo lo que quiere en esta vida). Una mejor analogía podría ser la clase ArrayList, que puede contener objetos arbitrarios y expandirse de forma dinámica según se añaden otros nuevos. | |
>>> li = ["a", "b", "mpilgrim", "z", "ejemplo"]>>> li ['a', 'b', 'mpilgrim', 'z', 'ejemplo'] >>> li[0]
'a' >>> li[4]
'ejemplo'
>>> li ['a', 'b', 'mpilgrim', 'z', 'ejemplo'] >>> li[-1]'ejemplo' >>> li[-3]
'mpilgrim'
>>> li ['a', 'b', 'mpilgrim', 'z', 'ejemplo'] >>> li[1:3]['b', 'mpilgrim'] >>> li[1:-1]
['b', 'mpilgrim', 'z'] >>> li[0:3]
['a', 'b', 'mpilgrim']
| Puede obtener un subconjunto de una lista, llamado “slice”[2], especificando dos índices. El valor de retorno es una nueva lista que contiene todos los elementos de la primera lista, en orden, comenzando por el primer índice del slice (en este caso li[1]), hasta el segundo índice sin incluirlo (en este caso li[3]). | |
| El particionado (slicing) funciona si uno de los dos índices o ambos son negativos. Si le ayuda, puede pensarlo de esta manera: leyendo la lista de izquierda a derecha, el primer índice especifica el primer elemento que quiere, y el segundo especifica el primer elemento que no quiere. El valor de retorno es todo lo que hay en medio. | |
| Las listas empiezan en cero, así que li[0:3] devuelve los tres primeros elementos de la lista, empezando en li[0], y hasta li[3], pero sin incluirlo. |
>>> li ['a', 'b', 'mpilgrim', 'z', 'ejemplo'] >>> li[:3]['a', 'b', 'mpilgrim'] >>> li[3:]
![]()
['z', 'ejemplo'] >>> li[:]
['a', 'b', 'mpilgrim', 'z', 'ejemplo']
| Si el índice izquierdo es 0, puede no ponerlo, y el 0 queda implícito. De manera que li[:3] es lo mismo que el li[0:3] del Ejemplo 3.8, “Slicing de una lista”. | |
| De forma similar, si el índice de la derecha es la longitud de la lista, puede eliminarlo. Así que li[3:] es lo mismo que li[3:5], porque esta lista tiene cinco elementos. | |
| Advierta la simetría. En esta lista de cinco elementos, li[:3] devuelve los 3 primeros elementos, y li[3:] devuelve los dos últimos. En realidad, li[:n] siempre devolverá los primeros n elementos, y li[n:] devolverá el resto, independientemente del tamaño de la lista. | |
| Si se omiten ambos índices se incluyen todos los elementos de la lista. Pero no es la misma que la lista original li; es una nueva lista que tiene todos los mismos elementos. li[:] es un atajo para hacer una copia completa de una lista. |
>>> li ['a', 'b', 'mpilgrim', 'z', 'ejemplo'] >>> li.append("nuevo")>>> li ['a', 'b', 'mpilgrim', 'z', 'ejemplo', 'nuevo'] >>> li.insert(2, "nuevo")
>>> li ['a', 'b', 'nuevo', 'mpilgrim', 'z', 'ejemplo', 'nuevo'] >>> li.extend(["dos", "elementos"])
>>> li ['a', 'b', 'nuevo', 'mpilgrim', 'z', 'ejemplo', 'nuevo', 'dos', 'elementos']
>>> li = ['a', 'b', 'c'] >>> li.extend(['d', 'e', 'f'])>>> li ['a', 'b', 'c', 'd', 'e', 'f'] >>> len(li)
6 >>> li[-1] 'f' >>> li = ['a', 'b', 'c'] >>> li.append(['d', 'e', 'f'])
>>> li ['a', 'b', 'c', ['d', 'e', 'f']] >>> len(li)
4 >>> li[-1] ['d', 'e', 'f']
>>> li ['a', 'b', 'nuevo', 'mpilgrim', 'z', 'ejemplo', 'nuevo', 'dos', 'elementos'] >>> li.index("ejemplo")5 >>> li.index("nuevo")
2 >>> li.index("c")
Traceback (innermost last): File "<interactive input>", line 1, in ? ValueError: list.index(x): x not in list >>> "c" in li
False
Antes de la versión 2.2.1, Python no tenía un tipo booleano. Para
compensarlo, Python aceptaba casi cualquier cosa en un contexto booleano
(como una sentencia if), de acuerdo a las siguientes reglas:
|
|
>>> li ['a', 'b', 'nuevo', 'mpilgrim', 'z', 'ejemplo', 'nuevo', 'dos', 'elementos'] >>> li.remove("z")>>> li ['a', 'b', 'nuevo', 'mpilgrim', 'ejemplo', 'nuevo', 'dos', 'elementos'] >>> li.remove("nuevo")
>>> li ['a', 'b', 'mpilgrim', 'ejemplo', 'nuevo', 'dos', 'elementos'] >>> li.remove("c")
Traceback (innermost last): File "<interactive input>", line 1, in ? ValueError: list.remove(x): x not in list >>> li.pop()
'elementos' >>> li ['a', 'b', 'mpilgrim', 'ejemplo', 'nuevo', 'dos']
>>> li = ['a', 'b', 'mpilgrim'] >>> li = li + ['ejemplo', 'nuevo']>>> li ['a', 'b', 'mpilgrim', 'ejemplo', 'nuevo'] >>> li += ['dos']
>>> li ['a', 'b', 'mpilgrim', 'ejemplo', 'nuevo', 'dos'] >>> li = [1, 2] * 3
>>> li [1, 2, 1, 2, 1, 2]
| Las listas también se pueden concatenar con el operador +. lista = lista + otralista da el mismo resultado que lista.extend(otralista). Pero el operador + devuelve una nueva lista (concatenada) como valor, mientras que extend sólo altera una existente. Esto significa que extend es más rápido, especialmente para listas grandes. | |
| Python admite el operador +=. li += ['dos'] es equivalente a li.extend(['dos']). El operador += funciona con listas, cadenas y enteros, y también puede sobrecargarse para trabajar con clases definidas por el usuario (más sobre clases en el Capítulo 5.) | |
| El operador * funciona en las listas como repetidor. li = [1, 2] * 3 es el equivalente a li = [1, 2] + [1, 2] + [1, 2], que concatena las tres listas en una. |
[2] N. del T.: porción, partición
<< Tipos de dato nativos |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
Presentación de las tuplas >> |