Comprobando si tipo == lista en python

2 minutos de lectura

avatar de usuario
benjamin lindqvist

No puedo averiguar qué está mal con mi código:

for key in tmpDict:
    print type(tmpDict[key])
    time.sleep(1)
    if(type(tmpDict[key])==list):
        print 'this is never visible'
        break

la salida es <type 'list'> pero la instrucción if nunca se dispara. ¿Alguien puede detectar mi error aquí?

  • has usado list como una variable en alguna parte? Tenga en cuenta que si está trabajando en REPL o similar, es posible que aún esté redefinido desde hace un tiempo.

    – Ffisegydd

    24 de octubre de 2014 a las 8:24


  • …..Woooowww… definitivamente una lección sobre las deficiencias de los lenguajes escritos suavemente. Guau…

    –Benjamin Lindqvist

    24 de octubre de 2014 a las 8:26

  • Agréguelo como respuestas y lo aceptaré. GRACIAS.

    –Benjamin Lindqvist

    24 de octubre de 2014 a las 8:27

  • pilinto y los amigos te ayudarán en el futuro (en realidad, no lo llamaría un defecto).

    usuario707650

    24 de octubre de 2014 a las 8:28

avatar de usuario
d-codificador

Deberías intentar usar isinstance()

if isinstance(object, list):
       ## DO what you want

En tu caso

if isinstance(tmpDict[key], list):
      ## DO SOMETHING

Elaborar:

x = [1,2,3]
if type(x) == list():
    print "This wont work"
if type(x) == list:                  ## one of the way to see if it's list
    print "this will work"           
if type(x) == type(list()):
    print "lets see if this works"
if isinstance(x, list):              ## most preferred way to check if it's list
    print "This should work just fine"

La diferencia entre isinstance() y type() aunque ambos parecen hacer el mismo trabajo es que isinstance() comprueba las subclases además, mientras que type() no.

Tu problema es que has redefinido list como una variable previamente en su código. Esto significa que cuando haces type(tmpDict[key])==list si va a volver False porque no son iguales.

Dicho esto, deberías usar en su lugar isinstance(tmpDict[key], list) al probar el tipo de algo, esto no evitará el problema de sobrescribir list pero es una forma más pitónica de verificar el tipo.

  • Agradable. ‘más Pythonic’ es un concepto amplio. solo por el bien de la educación: ¿cuáles-son-las-diferencias-entre-tipo-y-es-una-instancia?

    – Javi

    27 de mayo de 2020 a las 8:53


avatar de usuario
Prometeo

Esto parece funcionar para mí:

>>>a = ['x', 'y', 'z']
>>>type(a)
<class 'list'>
>>>isinstance(a, list)
True

Pitón 3.7.7

import typing
if isinstance([1, 2, 3, 4, 5] , typing.List):
    print("It is a list")

Aunque no tan sencillo como isinstance(x, list) uno podría usar también:

this_is_a_list=[1,2,3]
if type(this_is_a_list) == type([]):
    print("This is a list!")

y me gusta la simple inteligencia de eso

¿Ha sido útil esta solución?