2016-01-22 2 views
0

Я имею дело с 1. списком словарей и 2. списком. Я пытаюсь:
1. итерация по списку (список1)
2. Матч ценность LIST1 с в ID ответа API, если поместить весь в те- Dict в new_dict 3. еще пропуститьперечислить список и сравнить его значения с dict

API ответ в формате Json:

list_of_dict=[{"id":1500, 
     "f_name": "alex", 
     "age": 25 
     }, 

     {"id" :1501, 
     "f_name":"Bob", 
     "age": 30 
     }, 
     {"id" :1600, 
     "f_name":"Charlie", 
     "age": 35 
     } 
     ... 
    ] 

И песни1:

list1=[1500,1501,1211.....] 

в соответствии с этим, 1500 & 1501 присутствует в л ist_of_dict, чтобы весь dict был добавлен в new_dict.

Моя попытка:

new_dict=dict() 
for i,val in enumerate(list1): 
    #assuming val found in dict 
    #so put it in new dict 
    print i ,"=",val 
    new_dict.update({"id": val,"name":name, "age":age}) 

Что я вижу этот код принимает только последний элемент списка и обновляет Dict .. но в моем случае, new_dict будет содержит два словаря с идентификатором 1500 и 1501. Что мне не хватает?

+0

Давайте скажем, что 'list1 = [1500, 1501]' (так как это оба находятся в примере 'list_of_dict') - Что вам нужно после' new_dict'? – mgilson

+0

Я думаю, что OP хочет, чтобы выход был списком. Оператор обновления перезаписывает – inspectorG4dget

ответ

0
list_of_dict = [{"id":1500, 
        "f_name": "alex", 
        "age": 25 
        }, 

        {"id" :1501, 
         "f_name":"Bob", 
         "age": 30 
        }, 
        {"id" :1600, 
         "f_name":"Charlie", 
         "age": 35 
        } 
        ] 

list1=[1500,1501,1211] 

ret = filter(lambda x: x['id'] in list1, list_of_dict) 
print ret 

Заканчивать полезную и простую функцию фильтра встроенный в Python. Он перебирает итератор (список) и возвращает только те элементы, которые возвращают верно для предоставленной функции

В этом случае нашей функция фильтрации:

lambda x: x['id'] in list1 
0
list_of_dict = [{"id":1500, 
        "f_name": "alex", 
        "age": 25 
        }, 

        {"id" :1501, 
         "f_name":"Bob", 
         "age" 30 
        }, 
        {"id" :1600, 
         "f_name":"Charlie", 
         "age" 35 
        } 
        ... 
        ] 

dicts = {d['id']:d for d in list_of_dict} 
list1=[1500,1501,1211.....] 

answer = [dicts[k] for k in list1 if k in dicts] 
0

Вы можете сделать это с помощью простого списка понимания, фильтрации dicts от того, является ли их идентификатор в списке:

result = [d for d in list_of_dict if d["id"] in list1] 

Если ваш list1 больше, вы можете захотеть, чтобы превратить его в set первый, так что поиск быстрее:

list1_as_set = set(list1) 
result = [d for d in list_of_dict if d["id"] in list1_as_set] 
Смежные вопросы