если 2 значения в словаре принадлежат одному ключу, принадлежат ли они одному и тому же ключу в другом словаре? - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь сравнить два словаря, чтобы проверить точность большого набора данных

Я хочу посмотреть, принадлежат ли две точки одному ключу в словаре 1, принадлежат ли они одному ключу в словаре 2

У меня есть много способов сделать двойной цикл for с "если точки в обоих словарях", я ищу более быстрый способ сравнения обоих словарей

dict_1 имеет только 1 ключ длякаждый point_id, где dict_2 может иметь несколько ключей для 1 point_id

, оба словаря выглядят так:

{key1 : [list of point id], key2 : [list of point id], etc}

dict_1 = {key1 : [1,2,3,4,5,6], key2 : [7,8,9,10,11,12]}  
dict_2 = {key3 : [1,2,4,6,8,11,12], key4 :[2,5,7,9,10,11,12]}

def accuracy_from_dict_to_dict(dict_1,dict_2):
    total, truth = 0,0
    for key_dict_1 in dict_1:
        point_of_key = dict_1.get(key_dict_1)
        i=0
        while i < len(point_of_key): #for each point of the key_dict_1 list
          j = i+1
          while j < len(point of key):
              for key_dict_2 in dict_2:
                  point_i = point_of_key[i]
                  point_j = point_of_key[j]
                  if point_i in key_dict_2 and point_j in key_dict_2:
                      truth += 1
                  total += 1
                  j += 1  
          i+=1

Проблема не в самом коде, а в большейвремя расчета.если набор данных не достаточно мал, он будет долго работать

1 Ответ

0 голосов
/ 20 мая 2019

Похоже, вы просто проверяете комбинации из двух предметов из обоих вариантов. Вы можете сделать это лучше, используя модуль itertools из стандартной библиотеки:

from itertools import combinations, chain

dict_1 = {'key1' : [1,2,3,4,5,6], 'key2' : [7,8,9,10,11,12]}  
dict_2 = {'key3' : [1,2,4,6,8,11,12], 'key4' :[2,5,7,9,10,11,12]}

c_dict1 = set(chain.from_iterable(combinations(v, 2) for v in dict_1.values()))
c_dict2 = set(chain.from_iterable(combinations(v, 2) for v in dict_2.values()))
total = len(c_dict1) + len(c_dict2)
similarity = len(c_dict1 & c_dict2) / total
print(total, similarity)

напечатает вам:

69 0.2753623188405797

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...