목록에서 중복 항목을 제거하고 개수별로 정렬 하시겠습니까? (파이썬 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)

온라인으로 시도하십시오!

아래에 대한 개선 사항, 키를 a가 아닌 기본 제공으로 대체 하고 비교를 교체하는 데 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))))

온라인으로 시도하십시오!