Удалить дубликаты из списка и отсортировать по количеству? (питон 3)
Как удалить все дубликаты из списка и отсортировать его по количеству?
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, потому что я пытаюсь максимально сократить размер этого кода. Я пытался искать ответы, но ничего не нашел.
Ответы
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))))
Попробуйте онлайн!