Эффективный метод пересечения двух словарей Python для получения общих элементов обоих слов, если ключ одинаков - PullRequest
0 голосов
/ 29 ноября 2018

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

rcmd = {'1':{"A","B"},"2":{"A","C"},"3":{"B","C","D"}}   
rmv = {'1':{"C","B"},"2":{"A","C"},"3":{"B","C","A"},"4":{"A"}}

correct_rcmd = []
for i in range(len(rcmd)):
    for j in range(len(rmv)):
        if rcmd.keys()[i] == rmv.keys()[j]:
            correct_rcmd.append(rcmd.values() 
[i].intersection(rmv.values()[j]))
print correct_rcmd

1 Ответ

0 голосов
/ 29 ноября 2018

Вы никогда не должны использовать индексы в ключах словарей - особенно если вы используете Python 2.x (как предполагает использование print без ()).

Порядок ключей в словарях не фиксируется до 3.6 (только для CPython как побочного эффекта деталей реализации) или от включенного по умолчанию Python 3.7.

Порядок тогда порядок вставки - если вы вставляете ключи в другом порядке, индексирование в keys() все равно будет прерываться, поскольку вы смешиваете значения разных ключей!.

rcmd = {'1':{"A","B"},"2":{"A","C"},"3":{"B","C","D"}}   
rmv = {'1':{"C","B"},"2":{"A","C"},"3":{"B","C","A"},"4":{"A"}}

# get all keys that are common in both dictionaries
# python 2 or 3:
keys_that_are_same = set(rcmd) & set(rmv)
# for python 3 better, as it uses the key-sets directly: 
# keys_that_are_same = rcmd.keys() & rmv.keys()

# loop over both keys and get the intersection into a new dict:
common = {}
for key in keys_that_are_same:
    common[key] = rcmd[key] & rmv[key]

# as dict comprehension - no loop needed: 
# common = {k : rcmd[k] & rmv[k] for k in keys_that_are_same} 

print(common)

Вывод:

{'1': set(['B']), '3': set(['C', 'B']), '2': set(['A', 'C'])} # py 2.7

{'1': {'B'}, '2': {'A', 'C'}, '3': {'C', 'B'}}                # py 3.6

Это также имеет преимущество в использовании меньшего количества объектов, которые необходимо создавать и обрабатывать, а также в использовании наборов для уменьшения количества ключей, с которых нужно начинать работу.Если вы на Python 2.

...