Tengo dos dictados, uno en la lista:

var_a = [{'name':"John",'number':21},{'name':"Kevin",'number':23}]
var_b = {'21':"yes"},{'24':"yes"}

Necesito comparar var_a y var_b con la clave de var_b con el valor del número en var_a.

He intentado esto y obtuve el resultado:

for key, value in var_b.iteritems():
    for l in var_a:
        if l['number'] == key:
           print l

Esto necesita dos bucles para obtener la salida. Entonces, ¿hay alguna manera de terminar esto es un solo ciclo con Python 2.7?

1
Navi 24 jun. 2020 a las 15:38

3 respuestas

La mejor respuesta

Creo que necesitas usar la función lambda con un bucle for:

for key, value in var_b.iteritems():
    result = filter(lambda d: d['id'] == key, var_a)

El resultado le dará la salida con seguridad.

1
Santhosh 24 jun. 2020 a las 13:23

Puede usar map para crear un conjunto de teclas a partir de las teclas var_b y luego recorrer solo var_a para verificar si el valor numérico existe en el conjunto de teclas var_b

var_a = [{'name':"John",'number':21},{'name':"Kevin",'number':23}]
var_b = [{'21':"yes"},{'23':"no"}]

keys_set = set(map(lambda x: int(list(x.keys())[0]), var_b))
for i in var_a:
    if i['number'] in keys_set:
        print(i)

Salida

{'name': 'John', 'number': 21}
{'name': 'Kevin', 'number': 23}
1
Leo Arad 24 jun. 2020 a las 12:45

Suponiendo que var_b es en realidad un diccionario válido, es decir

var_b = {'21':"yes", '24':"yes"}

Puede optimizar este código haciendo un diccionario con var_a, siendo las claves los valores number. Luego, simplemente puede verificar si key de var_b está en ese diccionario:

var_a = [{'name':"John",'number':21},{'name':"Kevin",'number':23}]
var_b = {'21':"yes", '24':"yes"}

num_a = { str(v['number']) : v for v in var_a }

for key, _ in var_b.iteritems():
    if key in num_a:
        print num_a[key]

Salida:

{'name': 'John', 'number': 21}
0
Nick 24 jun. 2020 a las 12:50