Удалить дубликаты из списка и отсортировать по количеству? (питон 3)

Aug 19 2020

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

s = ["foo", "this", "lem", "foo", "lem"]
s = ["foo", "ebh", "wosv", "wosv", "ebh", "4whcu"]
#should return
>>> ["foo", "lem", "this"]
>>> ["ebh", "wosv", "foo", "4whcu"]

Правила:

  • Должен быть короче указанного ниже кода по размеру байта.
  • Порядок должен быть основан на количестве в порядке убывания.
  • Если есть две строки с одинаковым количеством, первое появление идет первым
  • Все дубликаты должны быть удалены, только одна строка каждой строки должна быть в окончательном списке

У меня сейчас есть

list({}.fromkeys(sorted(s,key=lambda y:-s.count(y))))

Я заметил такие ответы, setно это произвольно меняет порядок, чего я не хочу.

Изменить: извините за плохое качество раньше. Я взбил это прямо перед сном и очень устал. Это не для StackOverflow, потому что я пытаюсь максимально сократить размер этого кода. Я пытался искать ответы, но ничего не нашел.

Ответы

2 xnor Aug 20 2020 at 17:37

44 байта

sorted({}.fromkeys(s),key=s.count,reverse=1)

Попробуйте онлайн!

Улучшение приведенного ниже, замена ключа на встроенный, а не на lambda, и использование reverseдля обмена сравнениями. [::-1]Вместо этого мы бы хотели сделать окончательный результат, но это не дает правильных стабильных тай-брейков.


47 байт

sorted({}.fromkeys(s),key=lambda y:-s.count(y))

Попробуйте онлайн!

Простое транспонирование вашего кода, перемещение вашего {}.fromkeysтрюка с дедупликацией перед сортировкой. Поскольку сортировка преобразуется в список, извлекая ключи из словаря, это сохраняет list()вызов оригинала.

Для простоты использования исходный код:

53 байта

list({}.fromkeys(sorted(s,key=lambda y:-s.count(y))))

Попробуйте онлайн!