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, ¿hay una mejor manera de devolver una lista en Python 3 ?
python
python-3.x
list
dictionary
python-2.x
Dimitris Fasarakis Hilliard
fuente
fuente
Respuestas:
Tratar
list(newdict.keys())
.Esto convertirá el
dict_keys
objeto en una lista.Por otro lado, debe preguntarse si importa o no. La forma pitónica de codificar es asumir la escritura de un pato ( si parece un pato y grazna como un pato, es un pato ). El
dict_keys
objeto actuará como una lista para la mayoría de los propósitos. Por ejemplo:Obviamente, los operadores de inserción pueden no funcionar, pero eso no tiene mucho sentido para una lista de claves de diccionario de todos modos.
fuente
list(newdict)
También funciona (al menos en Python 3.4). ¿Hay alguna razón para usar el.keys()
método?pdb> list(newdict.keys())
falla porque choca con el comando pdb del mismo nombre. Se usapdb> !list(newdict.keys())
para escapar de los comandos pdb..keys()
es mucho más claro sobre lo que sucede.Python> = 3.5 alternativa: descomprimir en una lista literal
[*newdict]
Se introdujeron nuevas generalizaciones de desempaquetado (PEP 448) con Python 3.5 que le permite ahora hacer fácilmente:
Desempaquetar
*
funciona con cualquier objeto que sea iterable y, dado que los diccionarios devuelven sus claves cuando se repiten, puede crear fácilmente una lista usándola dentro de un literal de lista.Agregar, por
.keys()
ejemplo,[*newdict.keys()]
podría ayudar a que su intento sea un poco más explícito, aunque le costará una búsqueda de funciones e invocación. (que, con toda honestidad, no es algo de lo que realmente deba preocuparse).La
*iterable
sintaxis es similar a la de hacerlist(iterable)
y su comportamiento se documentó inicialmente en la sección Llamadas del manual de referencia de Python. Con PEP 448, la restricción sobre dónde*iterable
podría aparecer se aflojó permitiendo que también se coloque en 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)
la diferencia de que es más rápido (al menos para diccionarios pequeños) porque no se realiza ninguna llamada a la función: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 a función).
De manera similar, puede crear tuplas y conjuntos de claves de diccionario:
¡cuidado con la coma final en el caso de tupla!
fuente
def foo(*args): print(args)
seguidofoo(*{1:0, 2:0})
con el resultado que(1, 2)
se imprime. Este comportamiento se especifica en la sección Llamadas del manual de referencia. Python 3.5 con PEP 448 simplemente aflojó las restricciones sobre dónde pueden aparecer, lo[*{1:0, 2:0}]
que permite su uso ahora. De cualquier manera, editaré mi respuesta e incluiré esto.*newdict
- Esta es definitivamente la respuesta para los golfistas de código; P. Además , lo que, con toda honestidad, no es algo de lo que realmente deba preocuparse , y si lo es, no use python .list(newdict)
funciona en Python 2 y Python 3, proporcionando una lista simple de las claves ennewdict
.keys()
no es necesario (:fuente
Un poco fuera de lugar en la definición de "escritura de pato":
dict.keys()
devuelve un objeto iterable, no un objeto tipo lista. Funcionará en cualquier lugar que funcione un iterable, no en cualquier lugar donde funcione una lista. una lista también es iterable, pero un iterable NO es una lista (o secuencia ...)En casos de uso reales, lo más común con las claves en un dict es iterar a través de ellas, por lo que tiene sentido. Y si los necesita como una lista, puede llamar
list()
.De manera muy similar
zip()
, en la gran mayoría de los casos, se repite, ¿por qué crear una lista completamente nueva de tuplas solo para iterar y luego tirarla de nuevo?Esto es parte de una gran tendencia en Python para usar más iteradores (y generadores), en lugar de copias de listas por todo el lugar.
dict.keys()
Sin embargo, debería funcionar con las comprensiones: compruebe cuidadosamente los errores tipográficos o algo así ... funciona bien para mí:fuente
.keys()
; el objeto de diccionario es en sí iterable y produce teclas cuando se repiten a lo largo:[key.split(", ") for key in d]
.También puede usar una lista de comprensión :
O, más corto,
Nota: El pedido no está garantizado en versiones anteriores a 3.7 (el pedido sigue siendo solo un detalle de implementación con CPython 3.6).
fuente
list(newdict)
. No hay necesidad de una lista de comprensión aquí.La conversión a una lista sin usar el
keys
método lo hace más legible:y, al recorrer los diccionarios, no hay necesidad de
keys()
:a menos que lo esté modificando dentro del ciclo que requeriría una lista de claves creadas de antemano:
En Python 2 hay un aumento marginal de rendimiento con
keys()
.fuente
Si necesita almacenar las claves por separado, aquí hay una solución que requiere menos tipeo que cualquier otra solución presentada hasta ahora, utilizando el Desembalaje Iterable Extendido (python3.x +).
fuente
k
siempre hay una lista aquí. Si un usuario quiere una tupla o un conjunto de teclas, deberá recurrir a las otras opciones.*k, = d
tiene limitaciones sobre dónde puede aparecer (pero vea, y quizás actualice esta respuesta para, PEP 572 : el desempaquetado extendido no es compatible con las expresiones de asignación atm, ¡ pero podría ser algún día! )keys, vals = zip(*d.items())
(aunque eso da dos tuplas, lo suficientemente cerca). No sé de una expresión más corta que esta.Puedo pensar en 2 formas en que podemos extraer las claves del diccionario.
Método 1: - Para obtener las claves utilizando el método .keys () y luego convertirlo a la lista.
Método 2: - Para crear una lista vacía y luego agregar claves a la lista a través de un bucle. También puede obtener los valores con este bucle (use .keys () solo para claves y .items () para extracción de claves y valores)
fuente