Yinelenenler listeden kaldırılsın ve sayıya göre sıralansın mı? (piton 3)
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 set
ama 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
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 lambda
kullanı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!
{}.fromkeys
Sı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!