2016-07-12 3 views
2

У меня есть этот словарь:Pythonic способ найти и заменить словарь списков

dic = { 
'foo': ['one', 'two', 'three'], 
'bar': ['four', 'five', 'six'], 
'baz': ['seven', 'eight', 'nine'] 
} 

и из этого списка:

my_list = ['one', 'five', 'nine'] 

Я хочу найти соответствующий ключ в словаре в порядке чтобы получить этот новый список:

['foo', 'bar', 'baz'] 

Мой фактический рабочий код:

l = [] 
for el in my_list: 
    for d_key, d_val in dic.items(): 
     if el in d_val: 
      l.append(d_key) 

print(l) 

Но я думаю, что есть более путинский путь. Есть идеи?


редактировать:

Благодаря предложению TigerhawkT3 в (читаемость считает, но практичность бьет чистоту), я выбрал реверс моего словаря, чтобы непосредственно получить значение. Теперь мой код выглядит следующим образом:

dic = {'one': 'foo', 'two': 'foo', 'three': 'foo', 'four': 'bar', 'five': 'bar', 'six': 'bar', 'seven': 'baz', 'nine': 'baz', 'eight': 'baz'} 
my_list = ['one', 'five', 'nine'] 
print([dic[x] for x in my_list]) 
+0

Вы отрываясь значения, чтобы получить ключ. Это противоположность предполагаемому использованию словарей. – TigerhawkT3

+0

@ TigerhawkT3 Я не уверен, что это правильный дубликат, потому что и значение dict, и «my_list» - это список. – styvane

+0

Если есть несколько терминов для поиска, просто переверните их. «Вы можете поместить это в цикл, чтобы повторить его» не добавляет ничего сложного или уникального - методы в связанном вопросе могут быть легко применены к этой задаче. – TigerhawkT3

ответ

3

Я бы первый обратный словарь:

invdic = {val: key for key in dic for val in dic[key]} 

Затем вы можете применить замену:

l = ['one', 'five', 'nine'] 
l = list(invdic[x] for x in l) 
print(l) 

EDIT: Если вам нужно оставить ключевое слово as есть, когда словарь не содержит соответствия, вы можете заменить вторую строку следующим образом:

l = list(invdic.get(x, x) for x in l) 
2

Вы можете использовать isdisjoint(), чтобы проверить, имеет ли значение ключа общий элемент с вашим кортежем.

>>> s = set(my_list) 
>>> [key for key, value in dic.items() if not s.isdisjoint(value)] 
['foo', 'baz', 'bar'] 

Если заказ ключевого вопроса, то:

>>> [key for item in my_list for key, value in dic.items() if item in value] 
['foo', 'bar', 'baz'] 
Смежные вопросы