CUBIERTA DEL TÍTULO Un pariente de menor es el método de título (ver Apéndice B), que los casos de título de una cadena, es decir, todas las palabras comienzan con caracteres en mayúsculas y todos los demás caracteres están en minúsculas. sin embargo, la palabra límites se definen de una manera que puede dar algunos resultados no naturales. >>> "that's all folks".title() "That'S All, Folks" Una alternativa es la función capwords del módulo de cadena. >>> import string >>> string.capwords("that's all, folks") That's All, Folks" Por supuesto, si desea un título en mayúsculas correcto (que depende del estilo que está usando, posiblemente artículos en minúsculas, conjunciones de coordinación, preposiciones con menos de cinco letras, etc.), estás básicamente por tu cuenta.
REEMPLAZAR El método replace devuelve una cadena en la que se han reemplazado todas las apariciones de una cadena por otra. >>> 'This is a test'.replace('is', 'eez') 'Theez eez a test' Si alguna vez ha utilizado la función de "búsqueda y reemplazo" de un programa de procesamiento de textos, sin duda verá la utilidad de este método. Ver también: traducir. En el apéndice B: expandtabs.
DIVISIÓN Un método de cadena muy importante es el inverso, dividir o unir y se utiliza para dividir una cadena en una secuencia. >>> '1+2+3+4+5'.split('+') ['1', '2', '3', '4', '5'] >>> '/usr/bin/env'.split('/') ['', 'usr', 'bin', 'env'] >>> 'Using the default'.split() ['Using', 'the', 'default'] Tenga en cuenta que si no se suministra ningún separador, el valor predeterminado es dividir en todas las ejecuciones o caracteres de espacio en blanco consecutivos (espacios, pestañas, nuevas líneas, etc.). Vea también: unirse. En el apéndice b: partition, rpartition, rsplit, splitlines.
TIRA El método Strip devuelve una cadena donde el espacio en blanco de la izquierda y la derecha (pero no internamente) se ha quitado (eliminado). >>> ' internal whitespace is kept 'internal whitespace is kept'
'.strip()
Al igual que con Lower, Strip puede ser útil al comparar la entrada con los valores almacenados. Volvamos al ejemplo de nombres de usuario de la baja en inferior, y digamos que el usuario accidentalmente escribe un espacio después de su nombre. >>> names = ['gumby', 'smith', 'jones'] >>> name = 'gumby ' >>> if name in names: print('Found it!') ... >>> if name.strip() in names: print('Found it!') ... Found it! >>> También puede especificar qué caracteres se van a despojarse, enumerándolos todos en un parámetro de cadena. >>> '*** SPAM * for * everyone!!! ***'.strip(' *!') 'SPAM * for * everyone' El desmontaje se realiza sólo en los extremos, por lo que los asteriscos internos no se eliminan. En apéndice B: lstrip, rstrip.
TRADUCIR Similar a reemplazar, traducir reemplaza partes de una cadena, pero a diferencia de reemplazar, traducir funciona solo con caracteres individuales. Su punto fuerte es que puede realizar varios reemplazos a la vez y puede hacerlo más eficientemente que reemplazar. Hay muchos usos bastante técnicos para este método (como la traducción de caracteres de nueva línea u otros caracteres especiales que dependen de la plataforma), pero consideremos un ejemplo más simple (aunque un poco más tonto). Digamos que quiere traducir un texto en inglés simple a uno con acento alemán. Para hacer esto, debes reemplazar el carácter c con k, y s con z. Sin embargo, antes de poder utilizar traducir, debe hacer una tabla de traducción. Esta tabla de traducción contiene información sobre qué puntos de código Unicode deben traducirse a qué. Usted construye una tabla de este tipo utilizando el método maketrans en el mismo tipo de cadena str. El método toma dos argumentos: dos cadenas de longitud igual, donde cada carácter en la primera cadena debe ser reemplazado por el carácter en la misma posición en la segunda cadena. En el caso de nuestro ejemplo simple, el código se vería como el siguiente: >>> table = str.maketrans('cs', 'kz') Si lo deseamos, podemos echar un vistazo dentro de la tabla, aunque todo lo que veremos es una asignación entre los puntos de código Unicode. >>> table {115: 122, 99: 107} Una vez que tenga una tabla de traducción, puede usarla como argumento para el método translate. >>> 'this is an incredible test'.translate(table) 'thiz iz an inkredible tezt' Se puede proporcionar un tercer argumento opcional a maketrans, especificando las letras que deben eliminarse. Si quisiera emular a un alemán que habla muy rápido, por ejemplo, podría eliminar todos los espacios. >>> table = str.maketrans('cs', 'kz', ' ') >>> 'this is an incredible test'.translate(table) 'thizizaninkredibletezt' Ver también: replace, lower.
ES MI CADENA ... Hay muchos métodos de cadena que comienzan con ispace, isdigit o isupper, que determinan si su cadena tiene ciertas propiedades (como ser todos los espacios en blanco, dígitos o mayúsculas), en cuyo caso los métodos devuelven True. De lo contrario, por supuesto, devuelven Falso. En apéndice B: isalnum, isalpha, isdecimal, isdigit, isidentifier, islower, isnumeric, isprintable, isspace, istitle, isupper.
UN RESUMEN RÁPIDO En este capítulo, viste dos importantes formas de trabajar con string. Formato de cadena: el operador de módulo (%) se puede utilizar para empalmar valores en una cadena que contenga indicadores de conversión, como% s. Puede usar esto para dar formato a los valores de muchas maneras, incluyendo la justificación derecha o izquierda, estableciendo un ancho de campo específico y precisión, agregando un signo (más o menos) o relleno izquierdo con ceros. Métodos String: las cadenas tienen una plétora de métodos. Algunos de ellos son extremadamente útiles (como dividir y unir), mientras que otros se utilizan con menos frecuencia (como istitle o capitalizar).
NUEVAS FUNCIONES EM ESTE CAPÍTULO Función string.capwords(s[, sep])
Descripción Divide s con Split (usando Sep), capitaliza elementos y une con un solo espacio.
ascii(obj)
Construye una representación ASCII del objeto dado.
¿Y AHORA QUÉ? Las listas, las cadenas y los diccionarios son tres de los tipos de datos más importantes de Python. Has visto listas y cuerdas, así que adivina qué es lo siguiente. En el siguiente capítulo, miramos cómo los diccionarios soportan no sólo los índices enteros, sino también otros tipos de claves (como cadenas o tuplas). También tienen algunos métodos, aunque no tantos como cadenas.
CAPÍTULO 4 Diccionarios: Cuando los índices no lo hacen Ha visto que las listas son útiles cuando desea agrupar valores en una estructura y hacer referencia a cada valor por número. En este capítulo, aprenderá acerca de una estructura de datos en la que puede hacer referencia a cada valor por su nombre. Este tipo de estructura se denomina mapeo(mapping). El único tipo de mapeo integrado en Python es el diccionario. Los valores de un diccionario no tienen ningún orden en particular, pero se almacenan bajo una clave, que puede ser un número, una cadena o incluso una tupla.
USOS DEL DICCIONARIO El nombre del diccionario debe darle una pista sobre el propósito de esta estructura. Un libro ordinario se hace para la lectura de principio a fin. Si lo desea, puede abrirlo rápidamente en cualquier página determinada. Esto es un poco como una lista de Python. Por otro lado, los diccionarios (tanto los reales como el equivalente de Python) se construyen para que pueda buscar fácilmente una palabra específica (clave) para encontrar su definición (valor). Un diccionario es más apropiado que una lista en muchas situaciones. Estos son algunos ejemplos de usos de los diccionarios de Python:
• Representar el estado de un tablero de juego, con cada clave siendo una tupla de coordenadas. • Almacenamiento de los tiempos de modificación de archivos, con nombres de archivo como claves. • Un teléfono digital/libreta de direcciones. Digamos que tienes una lista de personas. >>> names = ['Alice', 'Beth', 'Cecil', 'Dee-Dee', 'Earl'] ¿Qué pasa si desea crear una pequeña base de datos donde pueda almacenar los números de teléfono de estas personas — ¿cómo harías eso? Una forma sería hacer otra lista. Digamos que está almacenando sólo sus extensiones de cuatro dígitos. Entonces conseguirías algo como esto: >>> numbers = ['2341', '9102', '3158', '0142', '5551'] Una vez que haya creado estas listas, puede buscar el número de teléfono de Cecil de la siguiente manera: >>> numbers[names.index('Cecil')] '3158' Funciona, pero es un poco impracticable. Lo que realmente querría hacer es algo como lo siguiente: >>> phonebook['Cecil'] '3158' ¿Adivina qué? Si la agenda es un diccionario, usted puede hacer justamente eso.
CREAR Y USAR DICCIONARIOS Los diccionarios se escriben así: phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'} Los diccionarios constan de pares (denominados elementos) de claves y sus valores correspondientes. En este ejemplo, los nombres son las claves y los números de teléfono son los valores. Cada tecla se separa de su valor por dos puntos (:), los elementos están separados por comas, y todo el asunto está encerrado entre llaves. Un diccionario vacío (sin ningún elemento) se escribe con sólo dos llaves, como esta: {}. Nota: las claves son únicas dentro de un diccionario (y cualquier otro tipo de mapeo). Los valores no necesitan ser únicos dentro de un diccionario.
LA FUNCIÓN DICT Puede utilizar la función dict para construir diccionarios de otras asignaciones (por ejemplo, otros diccionarios) o de secuencias de pares (clave, valor). >>> items = [('name', 'Gumby'), ('age', 42)] >>> d = dict(items) >>> d {'age': 42, 'name': 'Gumby'} >>> d['name'] 'Gumby' También se puede utilizar con argumentos de palabra clave, como se indica a continuación: >>> d = dict(name='Gumby', age=42) >>> d {'age': 42, 'name': 'Gumby'}
Aunque esta es probablemente la aplicación más útil de dict, también puede utilizarla con un argumento de asignación para crear un diccionario con los mismos elementos que la asignación. (Si se usa sin ningún argumento, devuelve un nuevo Diccionario vacío, al igual que otras funciones similares como List, Tuple y Str.) Si la otra asignación es un diccionario (que es, después de todo, el único tipo de asignación integrada), puede utilizar la copia del método de diccionario en su lugar, como se describe más adelante en este capítulo.
OPERACIONES BÁSICAS DEL DICCIONARIO El comportamiento básico de un diccionario en muchos sentidos refleja el de una secuencia. • len (d) devuelve el número de elementos (pares clave-valor) en d. • d [k] devuelve el valor asociado a la tecla k. • d [k] = v asocia el valor v con la tecla k. • del d [k] borra el ítem con la tecla k. • k en d comprueba si hay un elemento en d que tiene la tecla k. Aunque los diccionarios y las listas comparten varias características comunes, hay algunas distinciones importantes: Tipos de claves: las claves de diccionario no tienen que ser números enteros (aunque pueden serlo). Pueden ser cualquier tipo inmutable, como números de punto flotante (real), cadenas o tuplas. Adición automática: puede asignar un valor a una clave, incluso si esa clave no está en el diccionario para empezar; en ese caso, se creará un nuevo elemento. No se puede asignar un valor a un índice fuera del intervalo de la lista (sin usar Append o algo parecido). Pertenencia: la expresión k en d (donde d es un diccionario) busca una clave, no un valor. La expresión v en l, por otro lado (donde l es una lista) busca un valor, no un índice. Esto puede parecer un poco inconsistente, pero en realidad es bastante natural cuando te acostumas a ella. Después de todo, si el diccionario tiene la clave dada, comprobar el valor correspondiente es fácil. Sugerencia: comprobar la pertenencia a una clave en un diccionario es más eficaz que comprobar la pertenencia a una lista. la diferencia es mayor cuanto más grandes son las estructuras de datos. El primer punto, que las claves pueden ser de cualquier tipo inmutable, es la fuerza principal de los diccionarios. El segundo punto es importante, también. Sólo mira la diferencia aquí: >>> x = [] >>> x[42] = 'Foobar' Traceback (most recent call last): File "<stdin>", line 1, in ? IndexError: list assignment index out of range >>> x = {} >>> x[42] = 'Foobar' >>> x {42: 'Foobar'} Primero, intento asignar la cadena ' foobar ' a la posición 42 en una lista vacía — claramente imposible porque esa posición no existe. Para hacer esto posible, tendría que inicializar x con [None] * 43 o algo, en lugar de simplemente []. El siguiente intento, sin embargo, funciona perfectamente. Aquí asigno ' foobar ' a la clave 42 de un diccionario vacío. Puedes ver que no hay ningún problema aquí. Un nuevo elemento es simplemente añadido al diccionario, y estoy en el negocio. El listado 4-1 muestra el código del ejemplo de la guía telefónica.
Listing 4-1. Dictionary Example # A simple database # A dictionary with person names as keys. Each person is represented as # another dictionary with the keys 'phone' and 'addr' referring to their phone # number and address, respectively. people = { 'Alice': { 'phone': '2341', 'addr': 'Foo drive 23' }, 'Beth': { 'phone': '9102', 'addr': 'Bar street 42' }, 'Cecil': { 'phone': '3158', 'addr': 'Baz avenue 90' } } # Descriptive labels for the phone number and address. These will be used # when printing the output. labels = { 'phone': 'phone number', 'addr': 'address' } name = input('Name: ') # Are we looking for a phone number or an address? request = input('Phone number (p) or address (a)? ') # Use the correct key: if request == 'p': key = 'phone' if request == 'a': key = 'addr' # Only try to print information if the name is a valid key in # our dictionary: if name in people: print("{}'s {} is {}.".format(name, labels[key], people[name][key])) Aquí está una ejecución de muestra del programa: Name: Beth Phone number (p) or address (a)? p Beth's phone number is 9102.
FORMATO DE CADENA CON DICCIONARIOS En el Capítulo 3, vio cómo podría usar el formato de cadena para dar formato a los valores proporcionados como argumentos individuales (con nombre o sin nombre) al método de formato. A veces, la recopilación de un conjunto de valores con nombre en forma de diccionario puede facilitar las cosas. Por ejemplo, el diccionario puede contener todo tipo de información, y su cadena de formato solo seleccionará lo que necesite. Tendrás que especificar que estás suministrando una asignación, usando format_map. >>> phonebook {'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'} >>> "Cecil's phone number is {Cecil}.".format_map(phonebook) "Cecil's phone number is 3258." Cuando use diccionarios como este, puede tener cualquier número de especificadores de conversión, siempre que todas las claves dadas se encuentren en el diccionario. Este tipo de formato de cadena puede ser muy útil en sistemas de plantillas (en este caso, utilizando HTML). >>> template = ''' ...
{title}
... ...
{title}
...
{text}
... ''' >>> data = {'title': 'My Home Page', 'text': 'Welcome to my home page!'} >>> print(template.format_map(data))
My Home Page My Home Page
Welcome to my home page!
MÉTODOS DE DICCIONARIO Al igual que los otros tipos incorporados, los diccionarios tienen métodos. Si bien estos métodos pueden ser muy útiles, probablemente no los necesitará tan a menudo como los métodos de lista y cadena. Es posible que desee hojear esta sección primero para tener una idea de qué métodos están disponibles y luego volver más tarde si necesita averiguar exactamente cómo funciona un método determinado.
CLARO El método Clear elimina todos los elementos del diccionario. Se trata de una operación en contexto (como List. Sort), por lo que no devuelve nada (o, en su lugar, None). >>> d = {} >>> d['name'] = 'Gumby' >>> d['age'] = 42 >>> d {'age': 42, 'name': 'Gumby'} >>> returned_value = d.clear() >>> d {} >>> print(returned_value) None ¿Por qué es esto útil? Consideremos dos escenarios. Éste es el primero: >>> x = {} >>> y = x >>> x['key'] = 'value' >>> y {'key': 'value'} >>> x = {} >>> x = {} {'key': 'value'} Y aquí está el segundo escenario: >>> x = {} >>> y = x >>> x['key'] = 'value' >>> y {'key': 'value'} >>> x.clear() >>> y {} En ambos escenarios, x e y originalmente hacen referencia al mismo diccionario. En el primer escenario, yo "en blanco" x asignándole un nuevo Diccionario vacío. Eso no afecta a y en absoluto, que todavía se refiere al diccionario original. Este puede ser el comportamiento que desea, pero si realmente desea eliminar todos los elementos del diccionario original, debe usar Clear. Como puede ver en el segundo escenario, y también está vacío después.
COPIAR El método Copy devuelve un nuevo diccionario con los mismos pares clave-valor (una copia superficial, ya que los mismos valores son iguales, no copias). >>> x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']} >>> y = x.copy() >>> y['username'] = 'mlh' >>> y['machines'].remove('bar') >>> y {'username': 'mlh', 'machines': ['foo', 'baz']} >>> x {'username': 'admin', 'machines': ['foo', 'baz']} Como puede ver, cuando reemplaza un valor en la copia, el original no se ve afectado. Sin embargo, si modifica un valor (en su lugar, sin reemplazarlo), el original también se cambia porque el mismo valor se almacena allí (como la lista ' Máquinas ' en este ejemplo). Una manera de evitar ese problema es hacer una copia profunda, copiar los valores, los valores que contienen, y así sucesivamente, también. Esto se logra utilizando la función deepcopy desde el módulo de copia. >>> from copy import deepcopy >>> d = {} >>> d['names'] = ['Alfred', 'Bertrand'] >>> c = d.copy() >>> dc = deepcopy(d) >>> d['names'].append('Clive') >>> c {'names': ['Alfred', 'Bertrand', 'Clive']} >>> dc {'names': ['Alfred', 'Bertrand']}
FROMKEYS El fromkeys método crea un nuevo diccionario con las claves dadas, cada uno con un valor predeterminado correspondiente de none. >>> {}.fromkeys(['name', 'age']) {'age': None, 'name': None} Este ejemplo construye primero un diccionario vacío y, a continuación, llama al método fromkeys en ese para crear otro diccionario, una estrategia algo redundante. En su lugar, puede llamar al método directamente en dict, que (como se mencionó anteriormente) es el tipo de todos los diccionarios. (El concepto de tipos y clases se discute más detalladamente en el capítulo 7.) >>> dict.fromkeys(['name', 'age']) {'age': None, 'name': None} Si no desea utilizar None como valor predeterminado, puede proporcionar su propio predeterminado. >>> dict.fromkeys(['name', 'age'], '(unknown)') {'age': '(unknown)', 'name': '(unknown)'}
OBTENER El método get es una forma tolerante de acceder a los elementos del diccionario. Normalmente, cuando intentas acceder a un elemento que no está presente en el diccionario, las cosas van muy mal. >>> d = {} >>> print(d['name']) Traceback (most recent call last):
File "<stdin>", line 1, in ? KeyError: 'name' Ese no es el caso con get. >>> print(d.get('name')) None Como puede ver, cuando utiliza Get para acceder a una clave inexistente, no hay ninguna excepción. En su lugar, obtendrá el valor NONE. Puede suministrar su propio valor "default", que luego se utiliza en lugar de none. >>> d.get('name', 'N/A') 'N/A' Si la clave está ahí, obtén trabajos como la búsqueda de diccionarios comunes. >>> d['name'] = 'Eric' >>> d.get('name') 'Eric' El Listado 4-2 muestra una versión modificada del programa del Listado 4-1, que utiliza el método de obtención para acceder a las entradas de la "base de datos". Listing 4-2. Dictionary Method Example # A simple database using get() # Insert database (people) from Listing 4-1 here. labels = { 'phone': 'phone number', 'addr': 'address' } name = input('Name: ') # Are we looking for a phone number or an address? request = input('Phone number (p) or address (a)? ') # Use the correct key: key = request # In case the request is neither 'p' nor 'a' if request == 'p': key = 'phone' if request == 'a': key = 'addr' # Use get to provide default values: person = people.get(name, {}) label = labels.get(key, key) result = person.get(key, 'not available') print("{}'s {} is {}.".format(name, label, result))
A continuación se muestra un ejemplo de ejecución de este programa. Observe cómo la flexibilidad añadida de Get permite al programa dar una respuesta útil, a pesar de que el usuario introduce valores para los que no estábamos preparados. Nombre: Gumby ¿Número de teléfono (p) o dirección (a)? promedio de bateo El promedio de bateo de Gumby no está disponible.
ITEMS El método items devuelve todos los elementos del diccionario como una lista de elementos en los que cada elemento es del formulario (clave, valor). Los artículos no se devuelven en ningún orden en particular. >>> d = {'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0} >>> d.items()
dict_items([('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')]) El valor devuelto es de un tipo especial denominado vista de diccionario. Las vistas de diccionario se pueden usar para la iteración (consulte el capítulo 5 para obtener más información sobre esto). Además, puede determinar su longitud y comprobar la pertenencia. >>> it = d.items() >>> len(it) 3 >>> ('spam', 0) in it True Una cosa útil acerca de las vistas es que no copian nada; siempre reflejan el Diccionario subyacente, incluso si se modifica. >>> d['spam'] = 1 >>> ('spam', 0) in it False >>> d['spam'] = 0 >>> ('spam', 0) in it True Si, sin embargo, prefiere copiar los elementos en una lista (que es lo que sucedió cuando utilizó elementos en versiones anteriores de Python), siempre puede hacerlo usted mismo. >>> list(d.items()) [('spam', 0), ('title', 'Python Web Site'), ('url', 'http://www.python.org')]
LLAVES El método Keys devuelve una vista de Diccionario de las claves del diccionario.
POP El método pop se puede utilizar para obtener el valor correspondiente a una clave determinada y, a continuación, para quitar el par clave-valor del diccionario. >>> d = {'x': 1, 'y': 2} >>> d.pop('x') 1 >>> d {'y': 2}
POPITEM El método popitem es similar a List. pop, que aparece en el último elemento de una lista. A diferencia de List. pop, sin embargo, popitem sale de un elemento arbitrario porque los diccionarios no tienen un "último elemento" o cualquier orden en absoluto. Esto puede ser muy útil si desea eliminar y procesar los elementos uno por uno de una manera eficiente (sin recuperar una lista de las claves en primer lugar). >>> d = {'url': 'http://www.python.org', 'spam': 0, 'title': 'Python Web Site'} >>> d.popitem() ('url', 'http://www.python.org') >>> d {'spam': 0, 'title': 'Python Web Site'} Aunque popitem es similar al método de lista pop, no hay ningún diccionario equivalente de Append (que agrega un elemento al final de una lista). Debido a que los diccionarios no tienen orden, tal método no tendría ningún sentido.
■ Sugerencia: Si desea que el método popitem siga una ordenación predecible, echar un vistazo a la OrderedDict clase desde el módulo de colecciones.
SETDEFAULT El método setDefault es algo similar a get, ya que recupera un valor asociado a una clave dada. Además de la funcionalidad get, setDefault establece el valor correspondiente a la clave dada si no está ya en el diccionario. >>> d = {} >>> d.setdefault('name', 'N/A') 'N/A' >>> d {'name': 'N/A'} >>> d['name'] = 'Gumby' >>> d.setdefault('name', 'N/A') 'Gumby' >>> d {'name': 'Gumby'} Como puede ver, cuando falta la clave, setDefault devuelve el valor predeterminado y actualiza el Diccionario en consecuencia. Si la clave está presente, se devuelve su valor y el diccionario se deja sin cambios. El valor predeterminado es opcional, como con get; Si se deja fuera, no se utiliza ninguno. >>> d = {} >>> print(d.setdefault('name')) None >>> d {'name': None} ■ Sugerencia: Si desea un valor predeterminado global para todo el diccionario, consulte la clase defaultdict del módulo de colecciones.
ACTUALIZAR El método de actualización actualiza un diccionario con los elementos de otro. >>> d = { ... 'title': 'Python Web Site', ... 'url': 'http://www.python.org', ... 'changed': 'Mar 14 22:09:15 MET 2016' ... } >>> x = {'title': 'Python Language Website'} >>> d.update(x) >>> d {'url': 'http://www.python.org', 'changed': 'Mar 14 22:09:15 MET 2016', 'title': 'Python Language Website'} Los elementos en el Diccionario suministrado se agregan a la antigua, suplantando cualquier elemento allí con las mismas claves. Se puede llamar al método de actualización de la misma manera que la función dict (o el constructor de tipo), como se ha comentado anteriormente en este capítulo. Esto significa que se puede llamar a la actualización con una asignación, una secuencia (u otro objeto Iterable) de pares (clave, valor) o argumentos de palabra clave.
VALORES El método Values devuelve una vista de Diccionario de los valores del diccionario. A diferencia de las claves, la vista devuelta por valores puede contener Duplicados. >>> d = {} >>> d[1] = 1
>>> d[2] = 2 >>> d[3] = 3 >>> d[4] = 1 >>> d.values() dict_values([1, 2, 3, 1])