2015-12-16 3 views
2

У меня есть 2 словаря (d3 и d4), и я хочу посмотреть, находятся ли значения одного из словарей (d3) в ключах другого словаря (d4) и в этом случае сохранить значение этого словаря (d4) в новый список.Итерация над двумя словарями и получение списка в Python

d3 = {0: ['mo', 'A', 'la'], 1: ['tel', 'A', 'Al'], 2: ['Jak', 'E', 'Pum']} 
d4 = {'ko' : 'Paul', 'la' : 'John', 'si' : 'Peter', 'Al' : 'Laura', 'gh' : 'Will'} 
a3 = d3.values() 
b3 = d3.keys() 
a4 = d4.values() 
b4 = d4.keys() 
t = 0 

for i in a3:  
if i not in b4 == -1: 
    continue     
else:   
    taxa = a4[t] 
    t += 1 
print taxa 

С помощью этого кода я не получаю ожидаемый результат, который должен быть:

taxa = ['John', 'Laura'] 

В том случае, когда значение d3 не в ключах d4, было бы неплохо если он может вернуть «неизвестный» в списке. Таким образом, идеальный результат в этом случае будет выглядеть так:

taxa = ['John', 'Laura', 'unknown'] 

Я искал другие вопросы, и хотя некоторые из них похожи, я не нашел ни одного, объясняющую один случай, как этот

+1

Только быстрое примечание. 'if i not in b4 == -1' всегда оценивается как' if False: ' – Vovanrock2002

ответ

3

Вот как вы можете это сделать:

>>> d3 = {0: ['mo', 'A', 'la'], 1: ['tel', 'A', 'Al'], 2: ['Jak', 'E', 'Pum']} 
>>> d4 = {'ko' : 'Paul', 'la' : 'John', 'si' : 'Peter', 'Al' : 'Laura', 'gh' : 'Will'} 
>>> taxa = [] 
>>> 
>>> for l in d3.values(): 
...  v = next((d4[item] for item in l if item in d4), 'Unknown') 
...  taxa.append(v) 
... 
>>> taxa 
['John', 'Laura', 'Unknown'] 

next() возвратит первый элемент из выражения прошедшего генератора. Если ничего не найдено, возвращается 'Unknown'.

Таковыми могут быть объединены в одном списке понимание:

>>> [next((d4[item] for item in l if item in d4), 'Unknown') for l in d3.values()] 
['John', 'Laura', 'Unknown'] 
0

Вы также можете использовать набор постижений и chain.from_iterable из itertools модуля.

>>> from itertools import chain 
>>> d4 = {'ko' : 'Paul', 'la' : 'John', 'si' : 'Peter', 'Al' : 'Laura', 'gh' : 'Will'} 
>>> d3 = {0: ['mo', 'A', 'la'], 1: ['tel', 'A', 'Al'], 2: ['Jak', 'E', 'Pum']} 
>>> d3keys = set(chain.from_iterable(d3.values())) 
>>> {value if key in d3keys else 'unknown' for key, value in d4.items()} 
{'Laura', 'John', 'unknown'} 

или

>>> [value if key in d3keys else 'unknown' for key, value in d4.items()] 
['unknown', 'unknown', 'unknown', 'Laura', 'John'] 
Смежные вопросы