リストから重複を削除し、カウント順に並べますか?(python 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"]

ルール:

  • バイトサイズに関しては、以下のコードよりも短くする必要があります。
  • 順序は、降順のカウントに基づいている必要があります。
  • 同じ数の文字列が2つある場合、最初の出現が最初になります
  • すべての重複を削除する必要があります。各文字列の1つだけを最終リストに含める必要があります

私は現在持っています

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))))

オンラインでお試しください!