2016-07-21 4 views
0

Я хочу заполнить словарь, итерации по двум другим словарям. У меня есть рабочий пример, и я хотел бы знать, есть ли способ сделать это в понимании словаря (главным образом по причинам производительности) или сделать его более питоническим. Прежде всего, это код:Python - Заполнять словарь из вложенного понимания словаря

def get_replacement_map(dict_A, dict_B, min_sim): 
    replacement_map = {} # the dictionary i want to populate 

    for key_A, value_A in dict_A.items(): 

     best_replacement =() 
     best_similarity = 0 

     for key_B, value_B in dict_B.items(): 

      if key_B[0] != key_A[0]: 

       # similarity(x,y) may return None so in that case assign sim = 0 
       sim = similarity(value_A[0], value_B[0]) or 0 
       if sim > best_similarity and sim > min_sim: 
        best_replacement = key_B 
        best_similarity = sim 

        if sim > 0.9: # no need to keep looking, this is good enough! 
         break 

     if best_replacement: 
      synonym_map[key_A] = best_replacement 

    return replacement_map 

Это простая вещь. Он вычисляет сходство между элементами двух словарей и для каждого элемента находит наилучшую возможную замену (если сходство выше порога min_sim). Цель состоит в том, чтобы создать словарь замещений.

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

Если это нехорошая идея сделать это с помощью понятий, есть ли улучшения, которые я могу сделать?

+0

Следует упомянуть (и это скорее примечание, чем прямой ответ) - это использование 'dict.items()'. Хотя определенно намного лучше в python3, чем [он был в python 2] (http://stackoverflow.com/questions/12543837/python-iterating-over-list-vs-over-dict-items-efficiency), может быть полезно чтобы увидеть улучшение производительности путем итерации через ключи dict вместо «для ключа в dict», а затем вызывать значения с помощью 'dict [key]'. –

+0

@RNar спасибо, я попробую это. –

ответ

0

Это довольно сложная схема замены, которая, если бы вы содержали все это в однострочном пространстве, было бы очень трудно прочитать. Поддержание структуры и интервалов, имеющих отношение к пониманию потока, - это более питонический способ решить эту проблему.

Что касается увеличения производительности, вы, вероятно, не увидите никаких вопросов, как обсуждалось в this вопрос.

+0

Если бы я хотел получить обоснованное предположение, ваши лучшие достижения в производительности принесли бы оптимизацию функции 'сходство()' и использование cython – Aaron

+0

Вы правы, но функция подобия является функцией от сторонней библиотеки, и ее не так много я могу сделать. –

Смежные вопросы