Yinelenenler listeden kaldırılsın ve sayıya göre sıralansın mı? (piton 3)

Aug 19 2020

Tüm kopyaları listeden nasıl kaldırabilirim ve sayıya göre sıralayabilirim?

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

Kurallar:

  • Bayt boyutu açısından aşağıdaki koddan daha kısa olmalıdır.
  • Sıralama, sayısı azalan düzende temel alınmalıdır.
  • Aynı sayıya sahip iki dizge varsa, ilk görünüm önce gelir
  • Tüm kopyalar kaldırılmalı, son listede her dizeden yalnızca biri olmalıdır

Şu anda sahibim

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

Gibi cevaplar fark ettim setama bu keyfi olarak istemediğim sırayı değiştiriyor.

Düzenleme: Daha önce kalitesizlik için özür dilerim. Bunu uyumadan hemen önce kırbaçlamıştım ve oldukça yorgundum. Bu StackOverflow için değil çünkü bu kodun boyutunu mümkün olduğunca golf oynamaya / kısaltmaya çalışıyorum. Cevapları aradım ama hiçbir şey bulamadım.

Yanıtlar

2 xnor Aug 20 2020 at 17:37

44 bayt

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

Çevrimiçi deneyin!

Anahtarın a yerine yerleşik bir anahtarla değiştirilmesi ve karşılaştırmaları değiştirmek için lambdakullanılmasıyla , aşağıda bir iyileştirme reverse. [::-1]Bunun yerine nihai sonucu yapmak istiyoruz , ancak bu doğru istikrarlı eşitlik bozmaları yapmıyor.


47 bayt

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

Çevrimiçi deneyin!

{}.fromkeysSıralamadan önce tekilleştirme numaranızı hareket ettirerek kodunuzun basit bir aktarımı . Sıralama bir listeye dönüştüğü için, anahtarların bir sözlükten list()çıkarılması, orijinalin çağrısını kaydeder .

Başvuru kolaylığı için orijinal kod:

53 bayt

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

Çevrimiçi deneyin!