#python #python-3.x #list
Вопрос:
У меня есть список, содержащий имена файлов, некоторые из которых почти идентичны, за исключением строкового раздела с метками времени. Список представлен в формате [имя-подназвание-метка времени], например:
myList = ['name1-001-20211202811.txt', 'name1-001-202112021010.txt', 'name1-002-202112021010.txt', 'name2-002-202112020811.txt']
Что мне нужно, так это список, содержащий для каждого имени и подимена самый последний файл, полученный по метке времени. Я начал с создания списка, в котором содержатся все [имя-подназвание]:
name_subname_list = [] for row in myList: name_subname_list.append((row.rpartition('-')[0])) name_subname_list = set(name_subname_list) # {'name1-001', 'name2-002', 'name1-002'}
Не уверен, что это правильный подход, более того, я не уверен, как продолжать. Есть какие-нибудь идеи?
Ответ №1:
Этот код-это то, что вы просили:
Для каждого имени-подимена у вас будет соответствующий новейший файл:
from datetime import datetime as dt dic = {} for i in myList: sp = i.split('-') name_subname = sp[0] '-' sp[1] mytime = sp[2].split('.')[0] if name_subname not in dic: dic[name_subname] = mytime else: if dt.strptime(mytime, "%Y%m%d%H%M") gt; dt.strptime(dic[name_subname], "%Y%m%d%H%M"): dic[name_subname] = mytime result = [] for name_subname in dic: result.append(name_subname '-' dic[name_subname] '.txt')
что, resutl
по-видимому, похоже на:
['name1-001-202112021010.txt', 'name1-002-202112021010.txt', 'name2-002-202112020811.txt']
Комментарии:
1. другой дает неправильный результат для имени-поднима ‘name1-001’
2. Спасибо, я думаю, что это более безопасный подход, чем разбиение списка на целые числа, чтобы исправить проблему max ().
Ответ №2:
Попробуй это:
myList = ['name1-001-20211202811.txt', 'name1-001-202112021010.txt', 'name1-002-202112021010.txt', 'name2-002-202112020811.txt'] dic = {} for name in myList: parts = name.split('-') dic.setdefault(parts[0] '-' parts[1], []).append(parts[2]) unique_list = [] for key,value in dic.items(): unique_list.append(key '-' max(value))
Комментарии:
1. Большое вам спасибо, это почти идеально. Единственное, что функция max() странная, например max([‘20211202811’, ‘202112021010’]) возвращает 20211202811, что неверно (я предполагаю, что он игнорирует ноль в конце). Я исправлю это, преобразовав список в ints. Спасибо
2. Добро пожаловать. При использовании функции max() со строками длина элементов не важна, но результат сравнения между первыми несоответствующими элементами определит конечный результат. Например, max(«9», «899») вернет «9»! или макс(«1234», «1233666») вернет «1234»! Поэтому в вашем примере, если вы используете полный формат даты и времени (я имею в виду «0811» вместо «811»), функция max() будет вести себя ожидаемым образом. Вы также можете преобразовать строки DateTime в объекты datetime, а затем применить сравнение, как упомянуто в ответе Фатиме-Сангин.