Pengurutan Python

Cara termudah untuk mengurutkan adalah dengan {i>function<i} (daftar) yang diurutkan, yang mengambil sebuah daftar dan menampilkan daftar baru dengan elemen tersebut dalam urutan yang diurutkan. Daftar awal tidak diubah.

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

Hal yang paling umum adalah meneruskan daftar ke fungsi sequence(), tetapi sebenarnya itu dapat mengambil berbagai macam koleksi iterable sebagai input. Metode list.sort() lama adalah alternatif yang dijelaskan di bawah ini. Fungsi Sort() tampaknya lebih mudah digunakan dibandingkan dengan sort(), jadi saya sarankan untuk menggunakan sort().

Fungsi sort() dapat disesuaikan melalui argumen opsional. Argumen opsional yang diurutkan() terbalik=Benar, mis. diurutkan(list, reverse=True), membuatnya diurutkan 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 Kustom Dengan key=

Untuk pengurutan khusus yang lebih kompleks, sort() menggunakan "key=" opsional menentukan "key" yang mengubah setiap elemen sebelum dibandingkan. Fungsi kunci mengambil 1 nilai dan menampilkan 1 nilai, lalu "proxy" yang ditampilkan digunakan untuk perbandingan dalam pengurutan.

Misalnya dengan daftar {i>string<i}, menentukan key=len (fungsi bawaan len()) mengurutkan {i>string<i} menurut panjang, dari yang terpendek hingga terpanjang. Pengurutan memanggil 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']

memanggil diurutkan dengan key=len

Sebagai contoh lain, menentukan "str.lower" karena fungsi kunci adalah cara memaksa penyortiran untuk memperlakukan huruf besar dan huruf kecil 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 utama, 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 penyortiran yang lebih rumit seperti menyortir 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 diurutkan(), metode sort() pada daftar mengurutkan daftar itu dalam urutan menaik, misalnya {i>list.sort()<i}. Metode sort() mengubah daftar pokok dan menampilkan {i>None<i}, jadi gunakan seperti ini:

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

Hal di atas adalah kesalahpahaman yang sangat umum dengan sort() -- itu *tidak mengembalikan* daftar yang diurutkan. Metode sort() harus dipanggil dalam daftar; itu tidak berfungsi pada koleksi yang dapat dienumerasi (tetapi fungsi sort() di atas berfungsi pada apa pun). Metode sort() mendahului fungsi sort(), sehingga Anda kemungkinan akan melihatnya di kode lama. Metode sort() tidak perlu membuat daftar baru, jadi bisa sedikit lebih cepat jika elemen yang akan diurutkan sudah ada dalam daftar.

Tuple

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

Untuk membuat tuple, cukup cantumkan nilai dalam tanda kurung yang dipisahkan dengan koma. "kosong" tuple adalah 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 size-1, elemen tunggal harus diikuti dengan koma.

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

Ini adalah kasus lucu dalam sintaks, tetapi koma diperlukan untuk membedakan tuple dengan kasus biasa menempatkan ekspresi dalam tanda kurung. Dalam beberapa kasus, Anda dapat menghilangkan tanda kurung dan Python akan melihat dari koma yang Anda maksud sebagai tuple.

Menetapkan tuple ke tuple nama variabel yang berukuran identik menetapkan semua nilai yang sesuai. Jika tuple tidak memiliki ukuran yang 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 lanjutan 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 diperluas ke seluruh daftar. Misalkan kita memiliki daftar angka [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 adalah contoh string, dengan setiap string diubah menjadi huruf besar dengan '!!!' ditambahkan:

  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 hasilnya. Pengujian if dievaluasi untuk setiap elemen, hanya menyertakan elemen yang pengujiannya 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 berikutnya di list1.py yang menggunakan pengurutan dan tuple (dalam Latihan Dasar).