Удалите дубликаты имен файлов в списке

#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. О, я вижу, спасибо за ваш комментарий, я пропустил те, что без расширений. Спасибо