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