Estoy probando un código simple en Python donde tengo una lista de diccionarios y filtraré el valor basado en la clave entre los diccionarios.

Mi lista de diccionarios es esta:

Mylist = [
{"data": "two.mail-in.daimler.com.", "ttl": 3600, "type": "MX"},
{"data": "two.mail-in.daimler.com.", "ttl": 3600},
{"data": "two.mail-in.daimler.com.", "ttl": 3600, "type": "A"},
]

Quiero extraer el diccionario que tiene el par de valores clave como "tipo": "A" Para hacer eso, estoy usando el código de operación de:

a = list(filter(lambda type: type['type'] == 'A', Mylist))

No hay problema con este código. La cuestión es que el segundo diccionario no tiene una clave llamada "Tipo", por lo que genera una excepción KeyError y los programas se detienen sin verificar el tercer diccionario o el segundo índice de la lista.

Lo que quiero es ignorar el keyerror en el segundo diccionario y verificar el tercer diccionario e imprimir el diccionario que tiene el valor clave "type" = "A"

Así que intenté usar try / except.

Mylist = [

{"data": "two.mail-in.daimler.com.", "ttl": 3600, "type": "MX"},
{"data": "two.mail-in.daimler.com.", "ttl": 3600},
{"data": "two.mail-in.daimler.com.", "ttl": 3600, "type": "A"},
]

IP_Data =[]
for dicti in Mylist:

    try:
        a = list(filter(lambda type: type['type'] == 'A', Mylist))
        IP_Data.append(a)

    except:
        continue
print(IP_Data)

input()       

He hecho el resultado de una tienda en otra lista llamada IP_Data. cuando ejecuto el código, obtengo el resultado como una matriz vacía, es decir, [] ¿Puede alguien decirme por qué sucede esto y cualquier forma de hacer que todo el diccionario se almacene dentro de la matriz cuyo valor clave es type = A

P.s También intenté pasar en lugar de continuar, pero sigo teniendo el mismo problema.

Gracias.

1
Jacky 28 sep. 2019 a las 15:36

3 respuestas

La mejor respuesta

Utilice el método dict.get() en el diccionario Para evitar los casos en que el diccionario no tiene esa clave en particular, puede establecer un valor predeterminado si la clave no existe en el diccionario. Prueba esto :

Mylist = [
{"data": "two.mail-in.daimler.com.", "ttl": 3600, "type": "MX"},
{"data": "two.mail-in.daimler.com.", "ttl": 3600},
{"data": "two.mail-in.daimler.com.", "ttl": 3600, "type": "A"},
]
a = list(filter(lambda type: type.get('type', None) == 'A', Mylist))

Salida :

[{'data': 'two.mail-in.daimler.com.', 'ttl': 3600, 'type': 'A'}]
1
Arkistarvh Kltzuonstev 28 sep. 2019 a las 12:42

En lugar de usar la clave para acceder al valor en el código

a = list(filter(lambda type: type['type'] == 'A', Mylist))

Puede modificar su código para usar el método .get de un objeto de diccionario.

a = list(filter(lambda type: type.get('type','') == 'A', Mylist))

Aquí, si la clave 'tipo' no existe, puede pasar un valor predeterminado como segundo argumento, que en este caso he pasado como "" (cadena vacía)

0
rahul_mishra01 28 sep. 2019 a las 13:18

No anule la función integrada type, en lugar de tratar explícitamente de obtener la clave del diccionario, intente usar dictionary.get('key', None), y de esta manera no obtendrá el error de la clave.

0
simkus 28 sep. 2019 a las 12:44
58146373