#python #list
#питон #Список
Вопрос:
У меня есть список l
:
l = ['Abc.xlsx', 'Wqe.csv', 'Abc.csv', 'Xyz.xlsx']
В этом списке мне нужно удалить дубликаты без учета расширения. Ожидаемый результат приведен ниже.
l = ['Wqe.csv', 'Abc.csv', 'Xyz.xlsx']
Я пытался:
l = list(set(x.split('.')[0] for x in l))
Но получение только уникальных имен файлов без расширения
Как я мог этого достичь?
Комментарии:
1. Как вы узнаете, нужно ли удалять
Abc.xlsx
илиAbc.csv
2. Мне нужен любой из файлов, если я могу удалить какой-либо из них, будь то .xlsx или .csv. все в порядке
3. @MadPhysicist Я новичок в Py. Я пробовал использовать split, но все равно не могу получить расширение!
Ответ №1:
Вы можете использовать понимание словаря, в котором часть имени используется в качестве ключа, а полное имя файла-в качестве значения, используя тот факт, что ключи dict должны быть уникальными:
gt;gt;gt; list({x.split(".")[0]: x for x in l}.values()) ['Abc.csv', 'Wqe.csv', 'Xyz.xlsx']
Если имена файлов могут быть в более сложных форматах (например, с именами каталогов или в foo.bar.xls
формате), вам следует использовать os.path.splitext
:
gt;gt;gt; import os gt;gt;gt; list({os.path.splitext(x)[0]: x for x in l}.values()) ['Abc.csv', 'Wqe.csv', 'Xyz.xlsx']
Ответ №2:
Если порядок конечного результата не имеет значения, мы могли бы разделить каждый элемент на период. Мы будем рассматривать первый элемент в списке как ключ, а затем сохраним его, если ключ уникален.
oldList = l setKeys = set() l = [] for item in oldList: itemKey = item.split(".")[0] if itemKey in setKeys: pass else: setKeys.add(itemKey) l.append(item)
Ответ №3:
Попробуйте это
l = ['Abc.xlsx', 'Wqe.csv', 'Abc.csv', 'Xyz.xlsx'] for x in l: name = x.split('.')[0] find = 0 for index,d in enumerate(l, start=0): txt = d.split('.')[0] if name == txt: find = 1 if find gt; 1: l.pop(index) print(l)
Ответ №4:
@Selcuk Определенно лучшее решение, к сожалению, у меня недостаточно репутации, чтобы проголосовать за ваш ответ.
Но я бы предпочел использовать el[:el.rfind('.')]
в качестве ключа своего словаря, чем os.path.splitext(x)[0]
для обработки случая, когда у нас есть сложные форматы в названии. это даст что-то вроде этого:
list({x[:x.rfind('.')]: x for x in l}.values())
Комментарии:
1.
I would rather use el[:el.rfind('.')]
: Это не сработает для имен файлов без расширения. Всегда используйтеos.path
для манипулирования именами файлов, так как существует множество крайних случаев, о которых вы можете не сразу подумать.2. На самом деле было бы еще лучше использовать
pathlib
, но да, суть в том, что никогда не используйте строковые методы…3. О, я вижу, спасибо за ваш комментарий, я пропустил те, что без расширений. Спасибо