リストから重複を削除し、カウント順に並べますか?(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))))
オンラインでお試しください!