У меня есть словарь 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 раз, поэтому в настоящее время это невозможно. Любые предложения о том, как сделать это быстро?