В поисках эффективного метода поиска частичных строк в списках Python (3.6+).
У меня есть два списка.listA - это список строк pathname + уникальное имя файла:
['/pathname/uniquestring.ext', '/pathname/uniquestring.ext', '/pathname/uniquestring.ext' ...]
(создано с помощью glob (), имена файлов даны и уже существуют)
listB - это список словарей.Каждый словарь имеет одинаковый набор ключей, но уникальные значения.
[{key1:value1, key2:value2}, {key1:value3, key2:value4}, ...]
(также уже задано)
Одна пара ключ: значение в каждом словаре в listB будет иметь значение содержится в один уникальный элемент в списке A.
Однако позиция значения в том виде, в каком оно появляется в каждом элементе списка A. Не определена.
То, что я хотел, было: для каждогоitem в listB, найдите элемент в listA, который содержит подстроку, соответствующую паре k: v в dict, и создайте новый dict (или список кортежей) в качестве «таблицы поиска» (цель состояла в том, чтобы исправить поврежденное создание exif-файладата в наборе файлов изображений).
Пример:
listA = ['/pathname/abdce_654321.ext', '/pathname/a3b4c5_123456.ext', '/pathname/cbeebie_645321_abcde.ext', ...]
listB = [{"id": "123456", "create_date": "23/05/2014"}, ...]
new_dict = {"/pathname/a3b4c5_123456.ext": "23/05/2014, ...}
Я получил именно то, что я хочу от dict comp следующим образом:
{j:i['create_date'] for j in listA for i in listB if i['id'] in j}
Но , даже для моих очень маленьких файлов (~ 5500 наименований) это занимает 12 секунд на моем (по общему признанию, довольно старом) ноутбуке.
Предположительно, это потому, что мне приходится перебирать весь список B~ 5500 раз, используя мой метод.
Есть ли более эффективныйможно сделать это в Python?
(примечание: я не ищу совета о том, как исправить данные exif с помощью python;это обобщенный вопрос о поиске строк в списках)
ИСПРАВЛЕНИЯ И УТОЧНЕНИЯ
- В моем примере я пренебрег размещением кавычек вокруг значения '123456', подразумевая, конечно, что этоцелое число;В реальных данных это не так, равно как и эквивалентные значения в реальных данных, с которыми я имел дело.
- Подстрока 'id', как она появляется в элементе listA, почти всегда отделяетсяподчеркиваниями, но не всегда появляются в одной и той же позиции во всей строке;Таким образом, выполнение разделения ('_'), например, для каждого элемента, не всегда помещает строку 'id' в позицию [-1] или [-2] или [-3], хотя [-1] позаботитсяиз ~ 80% случаев.
- Все идентификаторы уникальны, они не появляются более одного раза в любом списке;каждое имя файла уникально в списке A;каждый идентификатор никогда не появляется более чем в одном словаре.
Спасибо за интерес, проявленный ко всем до сих пор.