Как удалить дубликаты из списка, сохранив регистр слов?

#python #python-3.x

#python #python-3.x

Вопрос:

Я хочу удалить дубликаты из списка ниже, сохранив регистр слов?

 lst = ['AWS Certification', 'AWS certification', 'AWS Certified Solutions Architect']
  

Я мог бы сделать что-то вроде,

 list(dict.fromkeys([item.casefold() for item in lst]))
# returns
['aws certification', 'aws certified solutions architect']
  

Но это приведет к тому, что все слова будут в нижнем регистре, а это не то, что мне нужно.

Ищете какой-либо однострочный код?

Комментарии:

1. Если есть дубликаты с разными регистрами, как вы узнаете, какой из них следует сохранить? Или это не имеет значения?

2. @0x5453 Для меня это не имеет значения

Ответ №1:

Вы можете сопоставить регистр с исходными значениями, а затем извлечь их:

 >>> list({i.casefold(): i for i in lst}.values())
['AWS certification', 'AWS Certified Solutions Architect']
  

Это сохранит последний вариант каждого дубликата из исходного списка, поскольку каждое новое вхождение будет переопределять предыдущее в dict.

Ответ №2:

На самом деле вы можете создать пару dict string : index пар, а затем использовать ее, чтобы вернуть исходные слова:

 lst = ['AWS Certification', 'AWS certification', 'AWS Certified Solutions Architect']

res = [lst[j] for j in {item.casefold() : i for i, item in enumerate(lst)}.values()]

print(res)
  

Вывод:

 ['AWS certification', 'AWS Certified Solutions Architect']
  

Ответ №3:

Вы могли бы использовать dict с форматом casefolded : normal , а затем принимать значения, поскольку ключи уникальны:

 lst = ['AWS Certification', 'AWS certification', 'AWS Certified Solutions Architect']

lst = list({j.casefold() : j for j in lst}.values())
print(lst)
# returns
['AWS certification', 'AWS Certified Solutions Architect']