items ialah senarai tupel jika diisih, fungsi Builtin Python sorted (atau sort) akan mengisih daripada elemen terakhir tuple, iaitu, satu set dua elemen tupel boleh dibayangkan sebagai dua pengisihan asas:
Asalnya:
[(2, 1), (1, 2)]
Isihan pertama menggunakan elemen kedua sebagai kunci, jadi hasil isihan ialah:
[(2, 1), (1, 2)]
Isihan kedua menggunakan elemen pertama sebagai kunci, jadi hasil isihan ialah:
[(1, 2), (2, 1)] # 最終結果
Kesimpulan (1):
Pengisihan tupel diisih dari elemen terakhir ke hadapan Maksudnya, berat pengisihan tupel bermula dari elemen pertama dan berkurangan ke belakang
Kemudian mari kita perhatikan pengisihan nilai Boolean:
print(sorted([True, False])
Keputusan:
[False, True] # False在前,True在後
Kesimpulan 2:
Isihan Boolean akan meletakkan False di hadapan dan True di bahagian bawah
Kemudian mari kita lihat contoh yang anda berikan Mari tulis fungsi mudah untuk memerhatikan hasilnya:
def show(s):
for x in s:
print((x.isdigit(), x.isdigit() and int(x)%2==0, x.isupper(), x.islower(), x))
fungsi show akan mencetak rentetan semasa s yang digunakan untuk menjana kunci tuple bagi setiap aksara semasa pengisihan.
Kemudian kami menggunakan kesimpulan 1 tadi Daripada menggunakan tuple sebagai kunci, kami menggunakan yang setara untuk mengisih kunci dari elemen terakhir ke hadapan , dan amati perubahan s dan tuple secara beransur-ansur. dalam kunci:
print('key=x')
s = sorted(s ,key=lambda x: x)
show(s)
print('key=islower()')
s = sorted(s ,key=lambda x: x.islower())
show(s)
print('key=isupper()')
s = sorted(s ,key=lambda x: x.isupper())
show(s)
print('key=isdigit() and int(x)%2==0')
s = sorted(s ,key=lambda x: x.isdigit() and int(x)%2==0)
show(s)
Kami akan mendapati bahawa, seperti yang dijangkakan, mengikut kesimpulan (1), pendekatan ini sememangnya setara dengan mengisih dengan tuple sebagai kunci sekali gus. Perhatikan pada masa yang sama, kesimpulan (2), untuk kekunci Boolean yang dijana oleh isdigit(), isupper(), islower(), dsb., hasil pengisihan juga seperti yang dijangkakan.
print('key=isdigit()')
s = sorted(s ,key=lambda x: x.isdigit())
show(s)
Tetapi saya rasa ini bukan kesimpulan terakhir kami, kerana ia adalah hasil kebetulan (mungkin terlalu banyak untuk mengatakan ia berlaku, ia harus dikatakan sebagai hasil yang kurang intuitif), mari kita simpulkan berdasarkan Kesimpulan (1) Analisis contoh asal:
Mula-mula susun aksara x itu sendiri, dan kemudian susun sama ada aksara itu huruf kecil, sama ada aksara itu huruf besar, sama ada aksara itu nombor genap dan sama ada aksara itu nombor.
juga boleh diterjemahkan sebagai:
Kami menggunakan sama ada aksara ialah nombor sebagai berat pengisihan tertinggi, dan kemudian kami menggunakan sama ada aksara itu nombor genap, sama ada aksara itu huruf besar, sama ada aksara itu huruf kecil dan aksara x itu sendiri sebagai beratnya.
Ini nampaknya berbeza daripada matlamat awal (#Sort: huruf kecil-huruf besar-ganjil-genap), sekurang-kurangnya ia tidak mempunyai korespondensi intuitif dengan matlamat.
Adalah disyorkan untuk menukarnya kepada:
print("".join(sorted(s1, key=lambda x: (not x.islower(), not x.isupper(), not(x.isdigit() and int(x)%2==1), x))))
Ini boleh ditafsirkan sebagai:
Kami menggunakan sama ada aksara itu huruf kecil sebagai pemberat tertinggi, dan kemudian menggunakan sama ada aksara itu huruf besar, sama ada aksara itu nombor ganjil, dan aksara x itu sendiri sebagai pemberat untuk diisih
Perkara yang menarik ialah: kami mahu watak-watak yang formula penghakimannya True dibandingkan dengan kedudukan sebelumnya selepas pengisihan selesai, jadi berdasarkan kesimpulan (2), kami menambah not supaya padanan aksara boleh berada di Hadapan.
Intinya adalah seperti yang donghui berkata, SALAH<BENAR. kunci ialah situasi pengisihan bagi tuple Setiap elemen yang akan diisih menghasilkan satu tuple (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x) Asasnya adalah FALSE<TRUE, false diletakkan di kedudukan pertama, dan true dinobatkan sebagai yang terakhir mereka adalah sama, Lihat seterusnya. disusun akhirnya mengembalikan unsur-unsur yang perlu diisih.
Kod ujian adalah seperti berikut: (dari dokelung dan donghui)
if __name__ == '__main__':
s = 'asdf234GDSdsf23'
print('key=x')
s = sorted(s, key=lambda x: x)
for x in s:
print((x, x))
print('key=islower()')
s = sorted(s, key=lambda x: x.islower())
for x in s:
print((x.islower(), x))
print('key=isupper()')
s = sorted(s, key=lambda x: x.isupper())
for x in s:
print((x.isupper(), x))
print('key=isdigit() and int(x)%2==0')
s = sorted(s, key=lambda x: x.isdigit() and int(x) % 2 == 0)
for x in s:
print((x.isdigit() and int(x) % 2 == 0, x))
print('key=(x.isupper(), x.islower())')
s = sorted(s, key=lambda x: (x.isupper(), x.islower()))
for x in s:
print((x.isupper(), x.islower(), x))
print('key=(x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x))')
s = sorted(s, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x))
for x in s:
print((x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x))
Jalankan dan lihat input untuk menemui corak. Output:
Bandingkan nilai pertama tuple dahulu, FALSE<TRUE, jika sama, bandingkan nilai tuple seterusnya dan seterusnya.
Mari kita mulakan dengan contoh mudah:
Keputusan:
items
ialah senarai tupel jika diisih, fungsi Builtin Pythonsorted
(atausort
) akan mengisih daripada elemen terakhir tuple, iaitu, satu set dua elemen tupel boleh dibayangkan sebagai dua pengisihan asas:Asalnya:
Isihan pertama menggunakan elemen kedua sebagai kunci, jadi hasil isihan ialah:
Isihan kedua menggunakan elemen pertama sebagai kunci, jadi hasil isihan ialah:
Kesimpulan (1):
Pengisihan tupel diisih dari elemen terakhir ke hadapan
Maksudnya, berat pengisihan tupel bermula dari elemen pertama dan berkurangan ke belakang
Kemudian mari kita perhatikan pengisihan nilai Boolean:
Keputusan:
Kesimpulan 2:
Isihan Boolean akan meletakkan
False
di hadapan danTrue
di bahagian bawahKemudian mari kita lihat contoh yang anda berikan Mari tulis fungsi mudah untuk memerhatikan hasilnya:
fungsi
show
akan mencetak rentetan semasas
yang digunakan untuk menjana kunci tuple bagi setiap aksara semasa pengisihan.Kemudian kami menggunakan kesimpulan 1 tadi Daripada menggunakan tuple sebagai kunci, kami menggunakan yang setara untuk mengisih kunci dari elemen terakhir ke hadapan , dan amati perubahan
s
dan tuple secara beransur-ansur. dalam kunci:Kami akan mendapati bahawa, seperti yang dijangkakan, mengikut kesimpulan (1), pendekatan ini sememangnya setara dengan mengisih dengan tuple sebagai kunci sekali gus.
Perhatikan pada masa yang sama, kesimpulan (2), untuk kekunci Boolean yang dijana oleh
isdigit()
,isupper()
,islower()
, dsb., hasil pengisihan juga seperti yang dijangkakan.Tetapi saya rasa ini bukan kesimpulan terakhir kami, kerana ia adalah hasil kebetulan (mungkin terlalu banyak untuk mengatakan ia berlaku, ia harus dikatakan sebagai hasil yang kurang intuitif), mari kita simpulkan berdasarkan Kesimpulan (1) Analisis contoh asal:
Kita boleh menterjemahkan pengisihan ini kepada:
juga boleh diterjemahkan sebagai:
Ini nampaknya berbeza daripada matlamat awal (#Sort: huruf kecil-huruf besar-ganjil-genap), sekurang-kurangnya ia tidak mempunyai korespondensi intuitif dengan matlamat.
Adalah disyorkan untuk menukarnya kepada:
Ini boleh ditafsirkan sebagai:
Perkara yang menarik ialah: kami mahu watak-watak yang formula penghakimannya
True
dibandingkan dengan kedudukan sebelumnya selepas pengisihan selesai, jadi berdasarkan kesimpulan (2), kami menambahnot
supaya padanan aksara boleh berada di Hadapan.Intinya adalah seperti yang
donghui
berkata, SALAH<BENAR.kunci ialah situasi pengisihan bagi tuple Setiap elemen yang akan diisih menghasilkan satu tuple
(x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x)
Asasnya adalah FALSE<TRUE, false diletakkan di kedudukan pertama, dan true dinobatkan sebagai yang terakhir mereka adalah sama, Lihat seterusnya. disusun akhirnya mengembalikan unsur-unsur yang perlu diisih.Kod ujian adalah seperti berikut: (dari
dokelung
dandonghui
)Jalankan dan lihat input untuk menemui corak.
Output: