Diberikan daftar string:

['foo2', 'abacus', 'azz', 'foo', 'foo3', 'bar', 'azb', 'bars13']

Ini adalah tampilan versi normal yang diurutkan setelah memanggil sorted:

['abacus', 'azb', 'azz', 'bar', 'bars13', 'foo', 'foo2', 'foo3']

Saya ingin memesan semuanya terlebih dahulu, dan kemudian, untuk semua string dengan huruf pertama yang sama, urutkan dalam urutan menurun.

Untuk contoh di atas, saya ingin

['azz', 'azb', 'abacus', 'bars13', 'bar', 'foo3', 'foo2', 'foo']

Bagaimana saya bisa melakukan ini?

1
cs95 8 Agustus 2017, 09:17

2 jawaban

Jawaban Terbaik

Anda dapat mengurutkan terlebih dahulu dalam urutan menurun, lalu mengurutkan berdasarkan huruf pertama. Karena algoritma pengurutan Python stabil, ini akan menghasilkan semua "ikatan" dalam jenis kedua (yaitu kata-kata dengan huruf pertama yang sama) yang tersisa dalam urutan relatif yang sama dengan jenis pertama.

l = sorted(l, reverse=True)
l = sorted(l, key=lambda s: s[0])

Anda juga dapat melakukan ini dalam satu panggilan ke sorted() sebagai berikut:

l = sorted(l, key=lambda s: (-ord(s[0]), s), reverse=True)
1
augurar 8 Agustus 2017, 06:31

Solusi dua pass yang berjalan pada baris yang sama dengan @COLDSPEED:

>>> import itertools
>>>
>>> l = ['foo2', 'abacus', 'azz', 'foo', 'foo3', 'bar', 'azb', 'bars13']
>>> s = sorted(l, key=lambda x:(x, len(x)))
>>> t = []
>>>
>>> for g, elems in itertools.groupby(s, key=lambda x: x[0]):
...     t.extend(reversed(list(elems)))
>>>
>>> t
['azz', 'azb', 'abacus', 'bars13', 'bar', 'foo3', 'foo2', 'foo']
0
Massimiliano 8 Agustus 2017, 06:39