Dict และ File ของ Python

ตารางแฮชของ Dict

โครงสร้างตารางแฮชคีย์/ค่าที่มีประสิทธิภาพของ Python เรียกว่า "dict" เนื้อหาของพจนานุกรมสามารถเขียนเป็นชุดคู่คีย์:ค่าภายในวงเล็บปีกกา { } เช่น dict = {key1:value1, key2:value2, ... } "พจนานุกรมว่าง" คือวงเล็บปีกกา {} ที่ว่างเปล่า

การค้นหาหรือการตั้งค่าค่าในพจนานุกรมจะใช้วงเล็บเหลี่ยม เช่น dict['foo'] จะค้นหาค่าภายใต้คีย์ "foo" สตริง ตัวเลข และทูเพลจะทํางานเป็นคีย์ และค่าอาจเป็นประเภทใดก็ได้ ส่วนประเภทอื่นอาจทำงานได้อย่างถูกต้องหรืออาจทำงานไม่ถูกต้องเป็นคีย์ (สตริงและทิวป์ทำงานเป็นปกติเนื่องจากจะเปลี่ยนแปลงไม่ได้) การค้นหาค่าที่ไม่ได้อยู่ในพจนานุกรมจะทำให้เกิดข้อผิดพลาด KeyError ให้ใช้ "in" เพื่อตรวจสอบว่าคีย์อยู่ในพจนานุกรมหรือไม่ หรือใช้ dict.get(key) ซึ่งจะแสดงผลค่าหรือ None หากไม่มีคีย์ (หรือ get(key, not-found) ช่วยให้คุณระบุค่าที่จะแสดงผลในกรณีที่ไม่พบ)

  ## 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)

คำสั่งด้วยคีย์ "a" "o" 'g"

นิพจน์ for ในพจนานุกรมจะวนซ้ำคีย์โดยค่าเริ่มต้น โดยคีย์จะปรากฏตามลำดับที่กำหนด เมธอด dict.keys() และ dict.values() จะแสดงรายการคีย์หรือค่าอย่างชัดเจน นอกจากนี้ยังมี items() ซึ่งจะแสดงรายการทูเพลต (คีย์, ค่า) ซึ่งเป็นวิธีที่มีประสิทธิภาพที่สุดในการตรวจสอบข้อมูลคีย์-ค่าทั้งหมดในพจนานุกรม รายการทั้งหมดเหล่านี้สามารถส่งไปยังฟังก์ชัน sorted() ได้

  ## 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

หมายเหตุเกี่ยวกับกลยุทธ์: จากมุมมองด้านประสิทธิภาพ พจนานุกรมเป็นหนึ่งในเครื่องมือที่ยอดเยี่ยมที่สุด และคุณควรใช้พจนานุกรมเมื่อใดก็ตามที่ทำได้เพื่อจัดระเบียบข้อมูล เช่น คุณอาจอ่านไฟล์บันทึกที่แต่ละบรรทัดขึ้นต้นด้วยที่อยู่ IP และจัดเก็บข้อมูลลงในพจนานุกรมโดยใช้ที่อยู่ IP เป็นคีย์ และรายการบรรทัดที่มีที่อยู่ IP นั้นปรากฏเป็นค่า เมื่อคุณอ่านทั้งไฟล์แล้ว คุณสามารถค้นหาที่อยู่ IP และดูรายการบรรทัดได้ทันที พจนานุกรมจะใช้ข้อมูลที่กระจัดกระจายและทําให้เป็นข้อมูลที่สอดคล้องกัน

การจัดรูปแบบ Dict

โอเปอเรเตอร์ % ทำงานอย่างสะดวกเพื่อแทนที่ค่าจาก dict เป็นสตริงตามชื่อ:

  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 กับองค์ประกอบหรือส่วนต่างๆ ของรายการเพื่อลบรายการส่วนนั้นและลบรายการออกจากพจนานุกรมได้ด้วย

  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}

ไฟล์

ฟังก์ชัน open() จะเปิดและแสดงผลตัวแฮนเดิลไฟล์ที่ใช้อ่านหรือเขียนไฟล์ได้ตามปกติ โค้ด f = open('name', 'r') จะเปิดไฟล์ลงในตัวแปร f ซึ่งพร้อมสําหรับการดําเนินการอ่าน และใช้ f.close() เมื่อเสร็จสิ้น ใช้ "w" แทน "r" สำหรับการเขียน และ "a" สำหรับการต่อท้าย วงวน for มาตรฐานใช้ได้กับไฟล์ข้อความ โดยวนผ่านบรรทัดของไฟล์ (ใช้ได้กับไฟล์ข้อความเท่านั้น ไม่ใช่ไฟล์ไบนารี) เทคนิคการใช้วงวน for เป็นวิธีที่ง่ายและมีประสิทธิภาพในการดูบรรทัดทั้งหมดในไฟล์ข้อความ

  # 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()

การอ่านทีละบรรทัดมีข้อดีตรงที่ไม่ต้องโหลดไฟล์ทั้งหมดลงในหน่วยความจำพร้อมกัน ซึ่งมีประโยชน์ในกรณีที่คุณต้องการดูทุกบรรทัดในไฟล์ขนาด 10 กิกะไบต์โดยไม่ต้องใช้หน่วยความจำ 10 กิกะไบต์ เมธอด f.readlines() จะอ่านทั้งไฟล์ลงในหน่วยความจำและแสดงผลเนื้อหาเป็นรายการบรรทัด เมธอด f.read() จะอ่านทั้งไฟล์เป็นสตริงเดียว ซึ่งอาจเป็นวิธีที่สะดวกในการจัดการกับข้อความทั้งหมดในครั้งเดียว เช่น กับนิพจน์ทั่วไปที่เราจะได้เห็นในภายหลัง

สําหรับการเขียน เมธอด f.write(string) เป็นวิธีที่ง่ายที่สุดในการเขียนข้อมูลไปยังไฟล์เอาต์พุตที่เปิดอยู่ หรือจะใช้ "print" กับไฟล์ที่เปิดอยู่ เช่น "print(string, file=f)" ก็ได้

ไฟล์ Unicode

หากต้องการอ่านและเขียนไฟล์ที่เข้ารหัส Unicode ให้ใช้โหมด `'t'` และระบุการเข้ารหัสอย่างชัดเจน ดังนี้


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'

การพัฒนาแบบเพิ่มทีละขั้น

การสร้างโปรแกรม Python อย่าเขียนทั้งหมดในขั้นตอนเดียว แต่ให้ระบุเพียงเหตุการณ์สำคัญแรก เช่น "ขั้นตอนแรกคือการดึงข้อมูลรายการคำ" เขียนโค้ดเพื่อไปให้ถึงเป้าหมายดังกล่าว เพียงพิมพ์โครงสร้างข้อมูลของคุณ ณ เวลานั้น จากนั้นก็ทำ sys.exit(0) เพื่อไม่ให้โปรแกรมทำงานในส่วนที่ยังไม่เสร็จสิ้นได้ เมื่อโค้ดของเหตุการณ์สำคัญทํางานแล้ว คุณจะทํางานกับโค้ดสําหรับเหตุการณ์สำคัญถัดไปได้ การดูภาพพิมพ์ของตัวแปรในสถานะหนึ่งจะช่วยให้คุณพิจารณาได้ว่าต้องเปลี่ยนรูปแบบตัวแปรเหล่านั้นอย่างไรเพื่อไปยังสถานะถัดไป Python ทำงานได้อย่างรวดเร็วด้วยรูปแบบนี้ ซึ่งช่วยให้คุณทําการเปลี่ยนแปลงเล็กน้อยและเรียกใช้โปรแกรมเพื่อดูวิธีการทํางานได้ ใช้ประโยชน์จากเวลาอันรวดเร็วนี้เพื่อสร้างโปรแกรมในไม่กี่ขั้นตอน

แบบฝึกหัด: wordcount.py

การรวมเนื้อหาพื้นฐานทั้งหมดของ Python เช่น สตริง รายการ พจนานุกรม มัลติเพล็ต ไฟล์ ให้ลองทำแบบฝึกหัดสรุป wordcount.py ในแบบฝึกหัดพื้นฐาน