2014-01-18 2 views
0

У меня есть следующие словари:удалить элементы из 2 словарей питона 3

a = {'f': 2, 'u': 210, 'the': 100, 'too': 300, 'my': 199, 'is': 2466, 'and': 3787} 
b = {'f': 9, 'u': 17, 'o': 14, 'the': 23, 'yy': 7, 'and': 12} 

Я хочу, чтобы удалить подобные ключи от обоих словарей.

У меня есть следующий код:

for item in a: 
     if item in b.keys(): 
      del a[item] 

Код аналогичен модификации словаря б.

Когда я бегу, я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "None", line 4, in <module> 
builtins.RuntimeError: dictionary changed size during iteration 

Есть ли способ решить эту проблему без использования DeepCopy, dict.has_key, почтовый индекс или любые модули? Кроме того, словари могут иметь любую длину.

ответ

2

Да, вы можете перебирать более list(dict). Это возвращает список ключей. В Python2 вы также можете использовать dict.keys().

for item in list(a): 
    if item in b: #Don't use b.keys() here, it is slow. 
     del a[item] 
+0

Можете ли вы (кратко) уточнить, почему использование 'b.keys()' во внутреннем цикле замедляет его? – BlackVegetable

+0

Заголовок вопроса говорит «python 3», поэтому я думаю, вам понадобится «list (a)». И поскольку мы используем python 3, 'b.keys()' также должен быть слишком быстрым (по сравнению со списком, я имею в виду.) – DSM

+0

@DSM Да, я уже обновлял ответ. –

1

Вы можете использовать dictionary comprehension:

>>> a = {'f': 2, 'u': 210, 'the': 100, 'too': 300, 'my': 199, 'is': 2466, 'and': 3787} 
>>> b = {'f': 9, 'u': 17, 'o': 14, 'the': 23, 'yy': 7, 'and': 12} 
>>> a = {k:v for k,v in a.items() if k not in b} 
>>> a 
{'is': 2466, 'my': 199, 'too': 300} 
>>> 
Смежные вопросы