valor resueltos recorrer lista elementos ejercicios diccionarios diccionario dentro declaracion convertir buscar agregar python python-3.x list dictionary python-2.x

resueltos - lista dentro de un diccionario python



¿Cómo devolver las claves del diccionario como una lista en Python? (9)

Además de las formas mencionadas en esta página, puede usar itemgetter del módulo del operador:

>>> from operator import itemgetter >>> list(map(itemgetter(0), dd.items())) [1, 2, 3]

En Python 2.7 , podría obtener claves de diccionario, valores o elementos como una lista:

>>> newdict = {1:0, 2:0, 3:0} >>> newdict.keys() [1, 2, 3]

Ahora, en Python> = 3.3 , obtengo algo como esto:

>>> newdict.keys() dict_keys([1, 2, 3])

Entonces, tengo que hacer esto para obtener una lista:

newlist = list() for i in newdict.keys(): newlist.append(i)

Me pregunto si hay una mejor manera de devolver una lista en Python 3 .


Además, la comprensión de listas no parece funcionar:

>>> parsed_results.keys() dict_keys([''Sounder V Depth, F'', ''Vessel Latitude, Degrees-Minutes'']) >>> things2plot = [key.split('', '') for key in parsed_results.keys()] >>> things2plot [''Sounder V Depth'', ''F''] >>> for key in parsed_results.keys(): ... print(key.split('', '')) ... [''Sounder V Depth'', ''F''] [''Vessel Latitude'', ''Degrees-Minutes'']

Personalmente, considero que esto es una "violación" de la escritura de pato y, en consecuencia, un "error". Pero supongo que alguien más debe haber notado esto a estas alturas y, por lo tanto, si no se ha solucionado, debe considerarse una "característica", pero por mi vida no puedo ver por qué.

Addenda en respuesta a Chris:

Bien, Chris, bueno, entonces al menos una mejor detección y notificación de uso indebido ("parece que no quieres un iterador aquí; ¿esperabas una lista? Intenta con la lista (dict.keys ()) ...") sería más como El útil Python que he llegado a conocer y amar. : / (Le pediría datos para respaldar su afirmación de que la funcionalidad del iterador es el caso de uso "más común" para dict.keys, pero es probable que pueda proporcionarlo) .-) Hasta el momento Como mi ejemplo de comprensión de lista no funciona (para mí), se cortó y pegó desde la línea de comandos del depurador de PyCharm, así que tal vez el problema sea un error en eso. (Ya me he encontrado con otro "error" en eso hoy, así que no me sorprendería en absoluto). ¡Gracias!


La conversión a una lista sin usar el método de keys hace más legible:

list(newdict)

y, cuando recorre los diccionarios, no hay necesidad de keys() :

for key in newdict: print key

a menos que lo esté modificando dentro del bucle que requeriría una lista de claves creadas de antemano:

for key in list(newdict): del newdict[key]

En Python 2 hay una ganancia de rendimiento marginal con las keys() .


Prueba la list(newdict.keys()) .

Esto convertirá el objeto dict_keys en una lista.

Por otro lado, debes preguntarte si te importa o no. La forma en que Pythonic codifica es asumir que el pato escribe ( si parece un pato y suena como un pato, es un pato ). El objeto dict_keys actuará como una lista para la mayoría de los propósitos. Por ejemplo:

for key in newdict.keys(): print(key)

Obviamente, los operadores de inserción pueden no funcionar, pero de todos modos eso no tiene mucho sentido para una lista de claves de diccionario.


También puede utilizar una lista de comprensión :

>>> newdict = {1:0, 2:0, 3:0} >>> [k for k in newdict.keys()] [1, 2, 3]


También puedes hacer una tuple(dict) o set(dict) :

>>> list(set(newdict)) [1, 2, 3] >>> list(tuple(newdict)) [1, 2, 3]


Un poco apagado en la definición de "escritura de pato" - dict.keys() devuelve un objeto iterable, no un objeto parecido a una lista. Funcionará en cualquier lugar donde funcionará un iterable, no en ningún lugar en una lista. una lista también es iterable, pero iterable NO es una lista (o secuencia ...)

En casos de uso reales, lo más común que se puede hacer con las claves en un dict es recorrerlas, así que esto tiene sentido. Y si los necesita como lista, puede llamar a list() .

De manera muy similar para zip() , en la gran mayoría de los casos, se itera a través de: ¿por qué crear una lista de tuplas completamente nueva para iterarla y luego volver a tirarla?

Esto es parte de una gran tendencia en Python a usar más iteradores (y generadores), en lugar de copias de listas por todas partes.

dict.keys() debería funcionar con comprensión, sin embargo, compruebe cuidadosamente si hay errores tipográficos o algo ... funciona bien para mí:

>>> d = dict(zip([''Sounder V Depth, F'', ''Vessel Latitude, Degrees-Minutes''], [None, None])) >>> [key.split(", ") for key in d.keys()] [[''Sounder V Depth'', ''F''], [''Vessel Latitude'', ''Degrees-Minutes'']]


list(newdict) funciona tanto en Python 2 como en Python 3, proporcionando una lista simple de las claves en newdict . keys() no es necesario. (:


Python> = 3.5 alternativa: desempaquetar en una lista literal [*newdict]

Se introdujeron nuevas generalizaciones de desempaquetado (PEP 448) con Python 3.5 que le permiten ahora hacer fácilmente:

>>> newdict = {1:0, 2:0, 3:0} >>> [*newdict] [1, 2, 3]

Desempaquetar con * funciona con cualquier objeto que sea iterable y, dado que los diccionarios devuelven sus claves cuando se iteran, puede crear fácilmente una lista usándola dentro de una lista literal.

Agregar .keys() es decir, [*newdict.keys()] podría ayudarlo a hacer su intento un poco más explícito, aunque le costará una función de búsqueda e invocación. (lo cual, con toda honestidad, no es algo de lo que realmente deba preocuparse).

La *iterable sintaxis *iterable es similar a hacer list(iterable) y su comportamiento se documentó inicialmente en la sección de llamadas del manual de referencia de Python. Con la PEP 448, se aflojó la restricción sobre dónde podría aparecer *iterable lo que permite colocarlo también en los literales de lista, conjunto y tupla, el manual de referencia en las listas de Expresión también se actualizó para indicar esto.

Aunque es equivalente a list(newdict) con la diferencia de que es más rápido (al menos para diccionarios pequeños) porque en realidad no se realiza ninguna llamada de función:

%timeit [*newdict] 1000000 loops, best of 3: 249 ns per loop %timeit list(newdict) 1000000 loops, best of 3: 508 ns per loop %timeit [k for k in newdict] 1000000 loops, best of 3: 574 ns per loop

con diccionarios más grandes, la velocidad es prácticamente la misma (la sobrecarga de iterar a través de una gran colección supera el pequeño costo de una llamada de función).

De manera similar, puede crear tuplas y conjuntos de claves de diccionario:

>>> *newdict, (1, 2, 3) >>> {*newdict} {1, 2, 3}

¡Cuidado con la coma final en el caso de la tupla!