Очень медленное понимание словаря Python

У меня есть словарь d1и список l1.

Ключи словаря — это строки, а значения — это объекты, которые я определил сам. Если это поможет, я могу описать объект более подробно, но пока у объектов есть атрибут списка names, а некоторые элементы nameмогут появляться или не появляться в l1.

Что я хотел сделать, так это выбросить любой элемент словаря d1, в котором атрибут nameобъекта в указанном элементе не содержит ни одного из элементов, которые появляются в l1.

В качестве тривиального примера:

l1 = ['cat', 'dog', 'mouse', 'horse', 'elephant', 
      'zebra', 'lion', 'snake', 'fly']

d1 = {'1':['dog', 'mouse', 'horse','orange', 'lemon'],
      '2':['apple', 'pear','cat', 'mouse', 'horse'], 
      '3':['kiwi', 'lime','cat', 'dog', 'mouse'], 
      '4':['carrot','potato','cat', 'dog', 'horse'], 
      '5':['chair', 'table', 'knife']}

поэтому результирующий словарь будет более или менее таким же, но элементами каждого списка будут пары ключей -значений от 1до 4, исключая фрукты и овощи, и не будет содержать 5-го ключа -значение par, так как ни одно из значений мебели не появляется в l1.

Для этого я использовал вложенный список/словарь, который выглядел так:

d2 = {k: [a for a in l1 if a in d1[k]] for k in d1.keys()}
print(d2)

>>>>{'1': ['dog', 'mouse', 'horse'], 
     '3': ['cat', 'dog', 'mouse'], 
     '2': ['cat', 'mouse', 'horse'], 
     '5': [], 
     '4': ['cat', 'dog', 'horse']}

d2 = {k: v for k,v in d2.iteritems() if len(v)>0}
print(d2)

>>>>{'1': ['dog', 'mouse', 'horse'], 
     '3': ['cat', 'dog', 'mouse'], 
     '2': ['cat', 'mouse', 'horse'],  
     '4': ['cat', 'dog', 'horse'],}

Кажется, это работает, но для больших словарей, 7000+ элементов, для обработки требуется около 20 секунд. Само по себе это не ужасно, но мне нужно сделать это внутри цикла, который будет повторяться 10 000 раз, поэтому в настоящее время это невозможно. Любые предложения о том, как сделать это быстро?

13
задан Davy Kavanagh 10 August 2012 в 15:17
поделиться