Hapus duplikat dari daftar dan urutkan menurut hitungan? (python 3)

Aug 19 2020

Bagaimana cara menghapus semua duplikat dari daftar dan memesannya berdasarkan hitungan?

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

Aturan:

  • Harus lebih pendek dari kode di bawah dalam hal ukuran byte.
  • Urutan harus berdasarkan hitungan dalam urutan menurun.
  • Jika ada dua senar dengan hitungan yang sama, maka kemunculan pertama lebih dulu
  • Semua duplikat harus dihapus, hanya satu dari setiap string yang harus ada di daftar akhir

Saya saat ini punya

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

Saya telah memperhatikan jawaban seperti settetapi itu secara sewenang-wenang mengubah urutan, yang tidak saya inginkan.

Edit: Maaf untuk kualitas yang buruk sebelumnya. Saya telah mencambuk ini tepat sebelum saya tidur dan saya sangat lelah. Ini bukan untuk StackOverflow karena saya mencoba golf / mempersingkat ukuran kode ini sebanyak mungkin. Saya sudah mencoba mencari jawaban tetapi saya belum dapat menemukan apa pun.

Jawaban

2 xnor Aug 20 2020 at 17:37

44 byte

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

Cobalah secara online!

Perbaikan di bawah ini, mengganti kunci dengan built-in daripada a lambda, dan menggunakan reverseuntuk menukar perbandingan. Kami ingin melakukan [::-1]pada hasil akhir sebagai gantinya, tetapi itu tidak melakukan tiebreak stabil yang benar.


47 byte

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

Cobalah secara online!

Transposisi sederhana dari kode Anda, memindahkan {}.fromkeystrik penghilangan duplikat sebelum penyortiran. Karena pengurutan diubah menjadi daftar, mengekstrak kunci dari kamus, list()panggilan asli akan disimpan .

Untuk memudahkan referensi, kode aslinya adalah:

53 byte

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

Cobalah secara online!