У меня есть два больших словаря, и оба словаря имеют одинаковые ключи (имя изображения) и имеют разные значения.
1-й диктант с именем train_descriptions
, который выглядит так:
{'15970.jpg': 'Turtle Check Men Navy Blue Shirt',
'39386.jpg': 'Peter England Men Party Blue Jeans',
'59263.jpg': 'Titan Women Silver Watch',
....
....
'1855.jpg': 'Inkfruit Mens Chain Reaction T-shirt'}
и второй дикт с именем train_features
{'31973.jpg': array([[0.00125694, 0. , 0.03409385, ..., 0.00434341, 0.00728011,
0.01451511]], dtype=float32),
'30778.jpg': array([[0.0174035 , 0.04345186, 0.00772929, ..., 0.02230316, 0. ,
0.03104496]], dtype=float32),
...,
...,
'38246.jpg': array([[0.00403965, 0.03701203, 0.02616892, ..., 0.02296285, 0.00930257,
0.04575242]], dtype=float32)}
Длина обоих словарей следующая:
len(train_descriptions)
это 44424 и len(train_features)
это 44441
Как видите, длина train_description
dict меньше длины train_features
. train_features
словарь содержит больше ключей-значений, чем train_descriptions
. Как удалить из train_features
словаря ключи, которых нет в train_description
? Чтобы их длина была одинаковой.
Использование for loop
feat = train_features.keys()
desc = train_description.keys()
common = list(i for i in feat if i not in decc)
for i in common: del train_features[i]
Обновлено: см. ниже
Код выше работает. Но мы можем сделать это более эффективно, не преобразовывая dict_keys в список следующим образом:
for i in train_features.keys() - train_description.keys(): del train_features[i]
Когда python dict_keys вычитаются, он дает dict_keys необычных ключей. Первый код сначала преобразовывался в список, который не был ни эффективным, ни обязательным.
Я бы предпочел использовать понимание списка, чем конструктор list()
плюс выражение генератора. Также перебор словаря основан на его ключах, нет необходимости в .keys()
. .keys()
полезен только тогда, когда вам нужно установить подобные операции.
Вы имеете в виду так: for i in train_features.keys() - train_description.keys(): del train_features[i]
просто pop()
если не существует в другом dict
.
for key in train_descriptions.keys():
if key not in train_features.keys():
train_features.pop(key)
Нет необходимости преобразовывать dict.keys() в список. Если он просто используется для цикла, мы можем передать его напрямую.
Используйте xor
, чтобы получить разницу между словарями
diff = train_features.keys() ^ train_descriptions.keys()
for k in diff:
del train_features[k]
Вы можете преобразовать оба в наборы (которые создают наборы ключей), применить соответствующую операцию набора и удалить найденные ключи в цикле for.