Dict dan File Python

Tabel {i>Hash Dict<i}

Struktur tabel hash nilai/kunci yang efisien pada Python disebut "dict". Isi dikte dapat ditulis sebagai serangkaian pasangan nilai kunci dalam tanda kurung kurawal { }, misalnya dict = {key1:value1, key2:value2, ... }. "Didik kosong" hanyalah sepasang kurung kurawal kosong {}.

Mencari atau menetapkan nilai dalam dict menggunakan tanda kurung siku, misalnya dict['foo'] mencari nilai di bawah kunci 'foo'. String, angka, dan tuple berfungsi sebagai kunci, dan jenis apa pun dapat menjadi nilai. Jenis lainnya mungkin atau mungkin tidak berfungsi dengan benar sebagai kunci (string dan tupel berfungsi dengan baik karena tidak dapat diubah). Mencari nilai yang tidak ada dalam dict akan memunculkan KeyError -- gunakan "in" untuk memeriksa apakah kunci ada dalam dict, atau gunakan dict.get(key) yang menampilkan nilai atau None jika kuncinya tidak ada (atau get(key, not-found) memungkinkan Anda menentukan nilai yang akan dikembalikan dalam kasus tidak ditemukan).

  ## Can build up a dict by starting with the empty dict {}
  ## and storing key/value pairs into the dict like this:
  ## dict[key] = value-for-that-key
  dict = {}
  dict['a'] = 'alpha'
  dict['g'] = 'gamma'
  dict['o'] = 'omega'

  print(dict) ## {'a': 'alpha', 'o': 'omega', 'g': 'gamma'}

  print(dict['a'])     ## Simple lookup, returns 'alpha'
  dict['a'] = 6       ## Put new key/value into dict
  'a' in dict         ## True
  ## print(dict['z'])                  ## Throws KeyError
  if 'z' in dict: print(dict['z'])     ## Avoid KeyError
  print(dict.get('z'))  ## None (instead of KeyError)

dict dengan kunci &#39;a&#39; &quot;o&quot; &#39;g&#39;

Loop for pada kamus melakukan iterasi pada kuncinya secara default. Kunci tersebut akan muncul dalam urutan arbitrer. Metode dict.keys() dan dict.values() menampilkan daftar kunci atau nilai secara eksplisit. Ada juga items() yang menampilkan daftar tuple (kunci, nilai), yang merupakan cara paling efisien untuk memeriksa semua data nilai kunci dalam kamus. Semua daftar ini dapat diteruskan ke fungsi sequence().

  ## By default, iterating over a dict iterates over its keys.
  ## Note that the keys are in a random order.
  for key in dict:
    print(key)
  ## prints a g o

  ## Exactly the same as above
  for key in dict.keys():
    print(key)

  ## Get the .keys() list:
  print(dict.keys())  ## dict_keys(['a', 'o', 'g'])

  ## Likewise, there's a .values() list of values
  print(dict.values())  ## dict_values(['alpha', 'omega', 'gamma'])

  ## Common case -- loop over the keys in sorted order,
  ## accessing each key/value
  for key in sorted(dict.keys()):
    print(key, dict[key])

  ## .items() is the dict expressed as (key, value) tuples
  print(dict.items())  ##  dict_items([('a', 'alpha'), ('o', 'omega'), ('g', 'gamma')])

  ## This loop syntax accesses the whole dict by looping
  ## over the .items() tuple list, accessing one (key, value)
  ## pair on each iteration.
  for k, v in dict.items(): print(k, '>', v)
  ## a > alpha    o > omega     g > gamma

Catatan strategi: dari sudut pandang kinerja, kamus adalah salah satu alat terhebat Anda, dan Anda harus menggunakannya di mana pun Anda bisa sebagai cara mudah untuk mengatur data. Misalnya, Anda dapat membaca file log yang setiap barisnya dimulai dengan alamat IP, lalu menyimpan data ke dalam skrip menggunakan alamat IP sebagai kunci, dan daftar baris tempat data muncul sebagai nilai. Setelah Anda membaca seluruh file, Anda dapat mencari alamat IP apa pun dan langsung melihat daftar barisnya. Kamus ini mengambil data yang tersebar dan membuatnya menjadi sesuatu yang koheren.

Pemformatan Dict

Operator % berfungsi dengan mudah untuk mengganti nilai dari dict ke dalam string berdasarkan nama:

  h = {}
  h['word'] = 'garfield'
  h['count'] = 42
  s = 'I want %(count)d copies of %(word)s' % h  # %d for int, %s for string
  # 'I want 42 copies of garfield'

  # You can also use str.format().
  s = 'I want {count:d} copies of {word}'.format(h)

Del

"del" operator melakukan penghapusan. Dalam kasus yang paling sederhana, ini dapat menghapus definisi variabel, seolah-olah variabel tersebut belum ditentukan. Del juga dapat digunakan pada elemen atau irisan daftar untuk menghapus bagian daftar tersebut dan untuk menghapus entri dari kamus.

  var = 6
  del var  # var no more!

  list = ['a', 'b', 'c', 'd']
  del list[0]     ## Delete first element
  del list[-2:]   ## Delete last two elements
  print(list)      ## ['b']

  dict = {'a':1, 'b':2, 'c':3}
  del dict['b']   ## Delete 'b' entry
  print(dict)      ## {'a':1, 'c':3}

File

Fungsi open() membuka dan menampilkan handle file yang dapat digunakan untuk membaca atau menulis file dengan cara biasa. Kode f = open('name', 'r') membuka {i>file<i} ke dalam variabel f, siap untuk membaca operasi, dan menggunakan f.close() setelah selesai. Sebagai ganti 'r', gunakan 'w' untuk menulis, dan 'a' untuk add-on. Standar for-loop berfungsi untuk file teks, melakukan iterasi melalui baris-baris file (ini hanya berfungsi untuk file teks, bukan file biner). Teknik for-loop adalah cara yang sederhana dan efisien untuk melihat semua baris dalam file teks:

  # Echo the contents of a text file
  f = open('foo.txt', 'rt', encoding='utf-8')
  for line in f:   ## iterates over the lines of the file
    print(line, end='')    ## end='' so print does not add an end-of-line char
                           ## since 'line' already includes the end-of-line.
  f.close()

Membaca baris demi baris memiliki kualitas yang bagus karena tidak semua file masuk ke dalam memori pada satu waktu - sangat praktis jika Anda ingin melihat setiap baris dalam file berukuran 10 gigabita tanpa menggunakan memori 10 gigabita. Metode f.readlines() membaca seluruh file ke dalam memori dan mengembalikan kontennya sebagai daftar barisnya. Metode f.read() membaca seluruh file menjadi satu string, yang dapat menjadi cara praktis untuk menangani teks sekaligus, seperti dengan ekspresi reguler yang akan kita lihat nanti.

Untuk menulis, metode f.write(string) adalah cara termudah untuk menulis data ke file {i>output<i} terbuka. Atau Anda dapat menggunakan "print" dengan file terbuka seperti "print(string, file=f)".

Unicode File

Untuk membaca dan menulis file yang dienkode dengan unicode, gunakan mode `'t'` dan tentukan encoding secara eksplisit:

with open('foo.txt', 'rt', encoding='utf-8') as f:
  for line in f:
    # here line is a *unicode* string

with open('write_test', encoding='utf-8', mode='wt') as f:
    f.write('\u20ACunicode\u20AC\n') #  €unicode€
    # AKA print('\u20ACunicode\u20AC', file=f)  ## which auto-adds end='\n'

Pengembangan Inkrementalitas Latihan

Membangun program Python, jangan menulis semuanya dalam satu langkah. Sebaliknya, identifikasi hanya {i>milestone<i} pertama, mis. "Langkah pertama adalah mengekstrak daftar kata." Tulis kode untuk mencapai tonggak pencapaian itu, dan cukup cetak struktur data Anda pada saat itu, dan kemudian Anda dapat melakukan sys.exit(0) sehingga program tidak berjalan ke bagian yang belum selesai. Setelah kode {i>milestone<i} berfungsi, Anda dapat mengerjakan kode untuk {i>milestone<i} berikutnya. Mampu melihat hasil cetak variabel pada satu status dapat membantu Anda memikirkan bagaimana Anda perlu mengubah variabel tersebut untuk mencapai status berikutnya. Python sangat cepat dengan pola ini, memungkinkan Anda membuat sedikit perubahan dan menjalankan program untuk melihat cara kerjanya. Manfaatkan perputaran cepat itu untuk membangun program Anda dalam langkah-langkah kecil.

Latihan: wordcount.py

Menggabungkan semua materi Python dasar -- string, daftar, skrip, tuple, file -- coba ringkasan latihan wordcount.py di Latihan Dasar.