Pengurutan Python

Cara termudah untuk mengurutkan adalah dengan fungsi Sort(list), yang mengambil daftar dan mengembalikan daftar baru dengan elemen tersebut dalam urutan yang diurutkan. Daftar asli tidak diubah.

  a = [5, 1, 4, 3]
  print(sorted(a))  ## [1, 3, 4, 5]
  print(a)  ## [5, 1, 4, 3]

Meneruskan daftar ke fungsi Sort() adalah yang paling umum, tetapi sebenarnya bisa dipakai sebagai input untuk koleksi iterable apa pun. Metode list.sort() yang lebih lama adalah alternatif yang dijelaskan di bawah ini. Fungsi mengurutkan() tampaknya lebih mudah digunakan dibandingkan dengan sort(), jadi saya merekomendasikan menggunakan sort().

Fungsi sort() dapat disesuaikan melalui argumen opsional. Argumen opsional yang diurutkan() reverse=True, misalnya diurutkan(list, reverse=True), membuatnya mengurutkan mundur.

  strs = ['aa', 'BB', 'zz', 'CC']
  print(sorted(strs))  ## ['BB', 'CC', 'aa', 'zz'] (case sensitive)
  print(sorted(strs, reverse=True))   ## ['zz', 'aa', 'CC', 'BB']

Penyortiran Khusus Dengan key=

Untuk penyortiran khusus yang lebih kompleks, mengurutkan() menggunakan opsi "key=" yang menentukan fungsi "kunci" yang mengubah setiap elemen sebelum perbandingan. Fungsi kunci menggunakan 1 nilai dan menampilkan 1 nilai, dan nilai "proxy" yang ditampilkan digunakan untuk perbandingan dalam pengurutan.

Misalnya dengan daftar string, menentukan key=len (fungsi bawaan len()) akan mengurutkan string berdasarkan panjangnya, dari yang terpendek ke yang terpanjang. Pengurutan menggunakan len() untuk setiap string guna mendapatkan daftar nilai panjang proxy, lalu mengurutkan dengan nilai proxy tersebut.

  strs = ['ccc', 'aaaa', 'd', 'bb']
  print(sorted(strs, key=len))  ## ['d', 'bb', 'ccc', 'aaaa']

panggilan diurutkan dengan key=len

Sebagai contoh lain, menentukan "str.lower" sebagai fungsi kunci adalah cara untuk memaksa pengurutan memperlakukan huruf besar dan huruf kecil dengan sama:

  ## "key" argument specifying str.lower function to use for sorting
  print(sorted(strs, key=str.lower))  ## ['aa', 'BB', 'CC', 'zz']

Anda juga dapat meneruskan MyFn Anda sendiri sebagai fungsi kunci, seperti ini:

  ## Say we have a list of strings we want to sort by the last letter of the string.
  strs = ['xc', 'zb', 'yd' ,'wa']

  ## Write a little function that takes a string, and returns its last letter.
  ## This will be the key function (takes in 1 value, returns 1 value).
  def MyFn(s):
    return s[-1]

  ## Now pass key=MyFn to sorted() to sort by the last letter:
  print(sorted(strs, key=MyFn))  ## ['wa', 'zb', 'xc', 'yd']

Untuk pengurutan yang lebih kompleks seperti mengurutkan berdasarkan nama belakang, lalu berdasarkan nama depan, Anda dapat menggunakan fungsi itemgetter atau attrgetter seperti:

  from operator import itemgetter

  # (first name, last name, score) tuples
  grade = [('Freddy', 'Frank', 3), ('Anil', 'Frank', 100), ('Anil', 'Wang', 24)]
  sorted(grade, key=itemgetter(1,0))
  # [('Anil', 'Frank', 100), ('Freddy', 'Frank', 3), ('Anil', 'Wang', 24)]

  sorted(grade, key=itemgetter(0,-1))
  #[('Anil', 'Wang', 24), ('Anil', 'Frank', 100), ('Freddy', 'Frank', 3)]

metode sort()

Sebagai alternatif untuk Sort(), metode sort() pada daftar mengurutkan daftar itu ke dalam urutan menaik, misalnya list.sort(). Metode sort() mengubah daftar yang mendasarinya dan mengembalikan None, jadi gunakan seperti ini:

  alist.sort()            ## correct
  alist = blist.sort()    ## Incorrect. sort() returns None

Hal di atas adalah kesalahpahaman yang sangat umum dengan sort() -- hal ini *tidak mengembalikan* daftar yang diurutkan. Metode sort() harus dipanggil dalam daftar; metode ini tidak berfungsi pada koleksi yang bisa dihitung (tetapi fungsi sort() di atas berfungsi pada semua hal). Metode sort() mendahului fungsi sort(), sehingga Anda mungkin akan melihatnya dalam kode yang lebih lama. Metode sort() tidak perlu membuat daftar baru, sehingga bisa menjadi sedikit lebih cepat jika elemen yang akan diurutkan sudah ada dalam daftar.

Tuple

Tuple adalah pengelompokan elemen dengan ukuran tetap, seperti koordinat (x, y). Tuple mirip seperti daftar, tetapi tidak dapat diubah dan tidak berubah ukuran (tuple tidak sepenuhnya dapat diubah karena salah satu elemen di dalamnya dapat diubah). Tuple memainkan peran "struct" di Python -- cara yang mudah untuk meneruskan paket nilai berukuran kecil yang logis dan tetap. Fungsi yang perlu menampilkan beberapa nilai hanya dapat menampilkan tuple nilainya. Misalnya, jika saya ingin memiliki daftar koordinat 3-d, representasi python alami akan menjadi daftar tuple, di mana setiap tuple berukuran 3 berisi satu grup (x, y, z).

Untuk membuat tuple, cukup cantumkan nilai dalam tanda kurung yang dipisahkan dengan koma. Tuple "kosong" hanyalah sepasang tanda kurung kosong. Mengakses elemen dalam tuple sama seperti daftar -- len(), [ ], for, in, dll. semuanya berfungsi sama.

  tuple = (1, 2, 'hi')
  print(len(tuple))  ## 3
  print(tuple[2])    ## hi
  tuple[2] = 'bye'  ## NO, tuples cannot be changed
  tuple = (1, 2, 'bye')  ## this works

Untuk membuat tuple ukuran-1, elemen tunggal harus diikuti dengan koma.

  tuple = ('hi',)   ## size-1 tuple

Ini adalah kasus lucu dalam sintaksis, tetapi koma diperlukan untuk membedakan tuple dari kasus biasa menempatkan ekspresi dalam tanda kurung. Dalam beberapa kasus, Anda dapat menghilangkan tanda kurung dan Python akan melihat dari koma tempat Anda menginginkan tuple.

Menetapkan tuple ke tuple nama variabel yang berukuran identik akan menetapkan semua nilai yang sesuai. Jika tupel tidak berukuran sama, akan muncul error. Fitur ini juga berfungsi untuk daftar.

  (x, y, z) = (42, 13, "hike")
  print(z)  ## hike
  (err_string, err_code) = Foo()  ## Foo() returns a length-2 tuple

Daftar Pemahaman (opsional)

Pemahaman daftar adalah fitur yang lebih canggih yang bagus untuk beberapa kasus tetapi tidak diperlukan untuk latihan dan bukan sesuatu yang perlu Anda pelajari pada awalnya (yaitu Anda dapat melewati bagian ini). Pemahaman daftar adalah cara ringkas untuk menulis ekspresi yang dapat diperluas ke seluruh daftar. Misalkan kita memiliki daftar nums [1, 2, 3, 4], berikut adalah pemahaman daftar untuk menghitung daftar kuadrat mereka [1, 4, 9, 16]:

  nums = [1, 2, 3, 4]

  squares = [ n * n for n in nums ]   ## [1, 4, 9, 16]

Sintaksisnya adalah [ expr for var in list ] -- for var in list terlihat seperti for-loop biasa, tetapi tanpa titik dua (:). expr di sebelah kirinya dievaluasi sekali untuk setiap elemen guna memberikan nilai untuk daftar baru. Berikut ini contoh dengan string, dengan setiap string diubah menjadi huruf besar dengan penambahan '!!!':

  strs = ['hello', 'and', 'goodbye']

  shouting = [ s.upper() + '!!!' for s in strs ]
  ## ['HELLO!!!', 'AND!!!', 'GOODBYE!!!']

Anda dapat menambahkan pengujian if di sebelah kanan for-loop untuk mempersempit hasil. Pengujian if dievaluasi untuk setiap elemen, hanya mencakup elemen yang bernilai benar (true).

  ## Select values <= 2
  nums = [2, 8, 1, 6]
  small = [ n for n in nums if n <= 2 ]  ## [2, 1]

  ## Select fruits containing 'a', change to upper case
  fruits = ['apple', 'cherry', 'banana', 'lemon']
  afruits = [ s.upper() for s in fruits if 'a' in s ]
  ## ['APPLE', 'BANANA']

Latihan: list1.py

Untuk mempraktikkan materi di bagian ini, coba soal selanjutnya di list1.py yang menggunakan pengurutan dan tupel (dalam Latihan Dasar).