Вы никогда не должны использовать индексы в ключах словарей - особенно если вы используете 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.