2016-11-14 2 views
0

Я работаю над функцией, где мне нужно найти значения в словаре, которые содержат ключевое слово и вернуть их (только те, у которых есть ключевое слово) вместе с их ключами. Я считаю, что мой код на правильном пути.Найти значения ключей в словаре, содержащих ключевое слово, и вернуть эти ключи и значения

Пример Словарь

{'M':[("One",1400,30.0, 20.5,"oil paint","Austria"),("Three",1430,100.0,102.0,"watercolor","France")], 
     'P':[("Eight",1460, 225.0, 200.0, "fresco","Netherlands"),("Six",1465,81.0, 127.1, "tempera", "Netherlands")], 
     'V':[("Four",1661, 148.0, 257.0,"oil paint", "Austria"),("Two",1630, 91.0, 77.0, "oil paint","USA")], 
     'K':[("Five",1922,63.8,48.1,"watercolor","USA"),("Seven",1950,61.0,61.0,"acrylic paint","USA")], 
     'C':[("Ten",1496,365.0,389.0,"tempera","Italy")], 
     'U':[("Nine",1203,182.0, 957.0,"egg tempera","Italy"), ("Twelve",1200,76.2,101.6,"egg tempera","France")] 
     } 

Так что, если я искал ключевое слово «акварель» функция должна вернуть эту

find_keyword(dictionary2(),'watercolor') 

{'M': [('Three', 1430, 100.0, 102.0,  
'watercolor', 'France')], 'K': [('Five',  
1922, 63.8, 48.1, 'watercolor', 'USA')]} 

Как вы можете видеть, что функция только поиск по ключевому слову акварелью и вернулся ключи и значения в том порядке, в котором они появились в словаре. Я думаю, что мой текущий код должен быть близок, но в настоящее время он дает мне ошибку Assertion и не возвращает ничего каждый раз. Кто-нибудь знает, как это исправить?

Текущий код:

def find_keyword(dictionary,theword): 
    keyword = {} 
    for key, record_list in dictionary.items(): 
     for record in record_list: 
      value = record[1] 
      if theword in record: 
       if key in keyword: 
        keyword[key].append(record) 
       else: 
        keyword[key] = [record] 
        return keyword 
+1

"* Символ *" ошибка никогда не хватает информации, смотрите также [просить]. –

+1

вы используете 'ключевое слово' в' find_keyword (..., keyword) ', а позже вы переписываете его в' keyword = {} ' – furas

+0

@furas Извините, что я менял кое-что, чтобы сделать мой код более ясным, надеюсь, мое редактирование теперь исправляет его – n00bprogrammer22

ответ

0
  • Используйте OrderedDict, так как вы хотите, чтобы вернуть первый матч в вашей dict.
  • Ваш метод имеет много ненужных звонков и свистов. Просто повторите попытку своего dict, найдите каждый ключ для своего ключевого слова и верните каждую пару значений ключа, которая является совпадением.

from collections import OrderedDict 
d = {'M':[("One",1400,30.0, 20.5,"oil paint","Austria"),("Three",1430,100.0,102.0,"watercolor","France")], 
    'P':[("Eight",1460, 225.0, 200.0, "fresco","Netherlands"),("Six",1465,81.0, 127.1, "tempera", "Netherlands")], 
    'V':[("Four",1661, 148.0, 257.0,"oil paint", "Austria"),("Two",1630, 91.0, 77.0, "oil paint","USA")], 
    'K':[("Five",1922,63.8,48.1,"watercolor","USA"),("Seven",1950,61.0,61.0,"acrylic paint","USA")], 
    'C':[("Ten",1496,365.0,389.0,"tempera","Italy")], 
    'U':[("Nine",1203,182.0, 957.0,"egg tempera","Italy"), ("Twelve",1200,76.2,101.6,"egg tempera","France")]} 
d = OrderedDict(sorted(d.items(), key=lambda x:x[1], reverse=True)) 

# -------------- ########## ------------ # 

def contains(seq, key): 
    """ 
    Create A helper function to search for a key 
    In a nested sequence of sequences. 
    """ 
    return any(key in el for el in seq) 

def find_key(d, key): 
    """ 
    Iterate thought your `dict`, search each key for your keyword, and 
    return each key value pair that is a match. 
    """ 
    tmp_dict ={} 
    for k, v in d.items(): 
     for tup in v: 
      if key in tup: 
       tmp_dict[k] = tup 
    return tmp_dict 

print(find_key(d,'watercolor')) 

Выход:

{'M': ('Three', 1430, 100.0, 102.0, 'watercolor', 'France'), 
'K': ('Five', 1922, 63.8, 48.1, 'watercolor', 'USA')} 
Смежные вопросы