Tengo el siguiente diccionario y la lista: ¿cómo puedo recorrer el diccionario para verificar si b == '1' al pasar '1' como variable de una lista?

dic = {'info': [{'a':0, 'b':'1'},{'a':0, 'b':'3'},{'a':0, 'b':'3'},{'a':0, 'b':'1'}]}

lst = ['1']

Quiero devolver {'a':0, 'b':'1'}, {'a':0, 'b':'1'}.

-1
Mac_W 13 ene. 2017 a las 15:05

6 respuestas

La mejor respuesta

Esta es una solución general que utiliza filter; el método incorporado, deberá adoptarlo según sus necesidades:

>>> list(filter(lambda d: d['b'] in lst, dic['info']))
[{'b': '1', 'a': 0}, {'b': '1', 'a': 0}]

Convertir el objeto filter en una lista usando el constructor list es necesario solo en Python3, mientras que en Python2, no es necesario:

>>> filter(lambda d: d['b'] in lst, dic['info'])
[{'b': '1', 'a': 0}, {'b': '1', 'a': 0}]

EDITAR: para hacer que la solución sea más general en caso de que haya varios elementos en lst, considere lo siguiente:

>>> dic
{'info': [{'b': '1', 'a': 0}, {'b': '3', 'a': 0}, {'b': '3', 'a': 0}, {'b': '1', 'a': 0}, {'b': '2', 'a': '1'}]}
>>>
>>> lst
['1', '2']
>>> def filter_dict(dic_lst, lst):
        lst_out = []
        for sub_d in dic_lst:
            if any(x == sub_d['b'] for x in lst):
                lst_out.append(sub_d)
        return lst_out

>>> filter_dict(dic['info'], lst)
[{'b': '1', 'a': 0}, {'b': '1', 'a': 0}, {'b': '2', 'a': '1'}]

O:

>>> list(map(lambda x: list(filter(lambda d: d['b'] in x, dic['info'])),lst))

[[{'b': '1', 'a': 0}, {'b': '1', 'a': 0}], [{'b': '2', 'a': '1'}]]
4
Iron Fist 13 ene. 2017 a las 12:59

Puede hacer uso de una lista de comprensión, o simplemente hacerlo con filtro.

comprensión de la lista

dict = {'info': [{'a':0, 'b':'1'},{'a':0, 'b':'3'},{'a':0, 'b':'3'},{'a':0, 'b':'1'}]}
lst = ['1']
result = [i for i in dict['info'] if i['b'] == lst[0]]

print result # [{'a': 0, 'b': '1'}, {'a': 0, 'b': '1'}]

filtro

dict = {'info': [{'a':0, 'b':'1'},{'a':0, 'b':'3'},{'a':0, 'b':'3'},{'a':0, 'b':'1'}]}
list(filter(lambda i: i['b'] in lst, dic['info']))

# [{'b': '1', 'a': 0}, {'b': '1', 'a': 0}]
0
akinjide 13 ene. 2017 a las 12:24

Solo una simple lista de comprensión:

In [22]: dic = {'info': [{'a':0, 'b':'1'},{'a':0, 'b':'3'},{'a':0, 'b':'3'},{'a':0, 'b':'1'}]}

In [23]: lst = ['1']

In [25]: [sub_dict for sub_dict in dic['info'] if sub_dict['b'] == lst[0]]
Out[25]: [{'a': 0, 'b': '1'}, {'a': 0, 'b': '1'}]
2
Kasramvd 13 ene. 2017 a las 12:08
from collections import defaultdict
dic = {'info': [{'a':0, 'b':'1'},{'a':0, 'b':'3'},{'a':0, 'b':'3'},{'a':0, 'b':'1'}]}
d = defaultdict(list)
for each in dic['info']:
    d[each['b']].append(each)

Fuera:

defaultdict(list,
            {'1': [{'a': 0, 'b': '1'}, {'a': 0, 'b': '1'}],
             '3': [{'a': 0, 'b': '3'}, {'a': 0, 'b': '3'}]})

En:

d['1']

Fuera:

[{'a': 0, 'b': '1'}, {'a': 0, 'b': '1'}]

Cree un índice dict para evitar repetir nuevamente.

1
宏杰李 13 ene. 2017 a las 12:34

Primero ve mi bucle simple y la forma de iteración

Entrada:

>>> dic
{'info': [{'a': 0, 'b': '1'}, {'a': 0, 'b': '3'}, {'a': 0, 'b': '3'}, {'a': 0, 'b': '1'}]}
>>> l
['1']

Nueva variable de lista para el resultado.

>>> result = []

Algo

  1. Iterar dicción por el método iteritems del diccionario.

  2. El valor del diccionario principal es el tipo de datos list. así que repita la lista por bucle for.

  3. La tecla de verificación b está presente en el sub diccionario y verifica que su valor esté presente en la lista dada l

  4. En caso afirmativo, entonces append a la lista de resultados.

código:

>>> for k,v in dic.iteritems():
...     for i in v:
...         if "b" in i and i["b"] in l:
...             result.append(i)
... 

Salida:

>>> result
[{'a': 0, 'b': '1'}, {'a': 0, 'b': '1'}]
>>> 

Notas:

  1. No use list como nombre de variable porque list es una palabra clave invertida para Python

  2. Lea cosas básicas del diccionario y enumere las propiedades que tiene.

  3. Intenta escribir el código primero.

0
Vivek Sable 13 ene. 2017 a las 12:23

Puede usar un enfoque filter:

filter(lambda x:x['b'] in list, dic['info'])

Creará un generador que puede materializar en una lista:

result = list(filter(lambda x:x['b'] in list, dic['info']))

Sin embargo, tenga en cuenta que cambiaría el nombre de su variable list ya que aquí anula una referencia al tipo list.

1
Willem Van Onsem 13 ene. 2017 a las 12:15