เฉลยแบบฝึกหัด: โครงสร้างข้อมูล I#

โจทย์เรื่องลิสต์#

ข้อ 1. สลากกินแบ่ง#

def lottery_check(lottery_numbers, first, end2):
    """

	ตัวอย่าง
    >>> lottery_check(['613728'], '613728', '28')
    [6005000, '613728']

    >>> lottery_check(['382982', '428121'], '613728', '28')
    [0]

    >>> lottery_check(['382982', '417328', '012828'], '613728', '28')
    [10000, '417328', '012828']

    """
    prize = 0
    winning_lotteries = []
    for lottery in lottery_numbers:
        # check first prize
        if lottery == first:
            prize = prize + 6000000
            winning_lotteries.append(lottery)

        # check last two digits
        last_two_digits = lottery[-2:]
        if last_two_digits == end2:
            prize = prize + 5000
            if lottery not in winning_lotteries:
                winning_lotteries.append(lottery)
    return [prize] + winning_lotteries
    #result = [prize]
    #result.extend(winning_lotteries)
    #return result
print(lottery_check(['613728'], '613728', '28'))
# [6005000, '613728']

print(lottery_check(['382982', '428121'], '613728', '28')
)# [0]

print(lottery_check(['382982', '417328', '012828'], '613728', '28')
)# [10000, '417328', '012828']
[6005000, '613728']
[0]
[10000, '417328', '012828']

ข้อ 2. ลิสต์อาหาร#

def select_ingredients(ingredients , prohibited):
	select_ingredients = []
	# วนลูปเพื่อเข้าถึงสมาชิกแต่ละตัวในลิสต์วัตถุดิบอาหารที่เพื่อนจะทำ
	for ingredient in ingredients:
		# ถ้าวัตถุดิบของอาหารนี้ไม่อยู่ในลิสต์ของวัตถุดิบที่เด็กไม่กินก็ใส่เข้าลิสต์ของวัตถุดิบที่สามารถใช้ได้
		if ingredient not in prohibited:
			select_ingredients.append(ingredient)
	return select_ingredients
ingredients = ['คะน้า', 'กระเทียม', 'น้ำมันหอย', 'หมูกรอบ', 'น้ำปลา', 'พริกไทย', 'ปลาเค็ม']
prohibited = ['น้ำปลา', 'กระเทียม', 'ปลาเค็ม', 'มะนาว']
select_ingredients(ingredients , prohibited)
['คะน้า', 'น้ำมันหอย', 'หมูกรอบ', 'พริกไทย']

ข้อ 3. a/an#

def correct_indefinite_article(sentence):
  """
	ตัวอย่าง
	>>> correct_article('A elephant steps on an piece of wood in a forest')
	'An elephant steps on a piece of wood in a forest
	"""
  result_list = []
  # 1. ตัดคำ
  words = sentence.split(' ')
  # 2. iterate over words, using index
  i = 0
  while i <= (len(words) - 2):
    word1 = words[i]
    word2 = words[i+1]
    # 3. check if word (word2) starts with vowel
    first_letter = word2[0].lower()
    # if first_letter == 'a' or first_letter == 'e' or first_letter == 'i' or first_letter == 'o' or first_letter == 'u':
    if first_letter in 'aeiou':
      # word2 starts with vowel
      if word1 == 'an' or word1 == 'An':
        pass
      elif word1 == 'a' or word1 == 'A':
        word1 = 'an'
    else:
      # word2 starts with consonant
      if word1 == 'a' or word1 == 'A':
        pass
      elif word1 == 'an' or word1 == 'An':
        word1 = 'a'
    result_list.append(word1)
    i = i + 1

  result_list.append(words[len(words)-1])
  result_string = ' '.join(result_list)
  result_string = result_string.capitalize()

  return result_string
correct_indefinite_article('A elephant steps on an piece of wood in a forest')
'An elephant steps on a piece of wood in a forest'

ข้อ 4. ทำความสะอาดข้อมูล#

def str_to_clean_list(text):
  """ Turn English text into clean words

	Example:
	>>> str_to_clean_list("I will not give up on this. If I feel tired, I will take a rest.")
	['I','will','not','give','up','on','this','If','I','feel','tired','I','will','take','a','rest']
  """
  """
	แนวทางการคิด
	1. ควรเอาเครื่องหมายวรรคตอนออกจากสตริงก่อน
	2. ใช้ method .split()
  """
  # 1. remove punctutations
  string_punc_removed = ''
  for char in text:
    if char in '.,!?:':
      pass
    else:
      string_punc_removed = string_punc_removed + char

  # 2. split
  words = string_punc_removed.split(' ')
  return words
str_to_clean_list("I will not give up on this. If I feel tired, I will take a rest.")
['I',
 'will',
 'not',
 'give',
 'up',
 'on',
 'this',
 'If',
 'I',
 'feel',
 'tired',
 'I',
 'will',
 'take',
 'a',
 'rest']

ข้อ 5. ความยาวเฉลี่ยของคำ#

def compute_mean_number_of_words(text):
  # remove punctuation and split
  words = str_to_clean_list(text)

  # วิธีที่ 1: for loop ปกติ
  """
  word_length_list = []
  for w in words:
  word_length_list.append(len(w))
  """
  # วิธีที่ 2: list comprehension
  word_length_list = [len(w) for w in words]

  # คำนวณผลรวมยาวความของคำ
  total_word_length = sum(word_length_list)

  # คำนวณค่าเฉลี่ยความยาวของคำ
  average_word_length = total_word_length / len(words)
  return average_word_length
compute_mean_number_of_words("I will not give up on this. If I feel tired, I will take a rest.")
2.875

ข้อ 6. ตรวจข้อสอบ#

def grade_exam(correct_list, answer_list):
  """
    >>> check_exam(['a','b','d','a','c'], ['a','a','b','d','a'])
    (1, [1, 0, 0, 0, 0])
    >>> check_exam(['a','b','d','a','c'], ['a','b','d','a','c'])
    (5, [1, 1, 1, 1, 1])
  """
  i = 0
  score = 0
  # ใช้ while loop เพื่อให้สามารถวนลูปเข้าถึงสมาชิกของลิสต์ทั้งสองอันได้ในเวลาเดียวกันจะได้นำสมาชิกสองตัวมาเปรียบเทียบกันได้
  while i < len(correct_list):
      # ดึงคำตอบที่ถูกต้องและคำตอบของนักเรียนจากรายการตามลำดับ
      correct_answer = correct_list[i]
      student_answer = answer_list[i]
      # เพิ่มคะแนนหากคำตอบของนักเรียนตรงกับคำตอบที่ถูกต้อง
      if correct_answer == student_answer:
          score += 1
      # ไม่เพิ่มคะแนนหากคำตอบไม่ตรงกับคำตอบที่ถูกต้อง
      else:
          score += 0
      i += 1

  # คำนวณเปอร์เซ็นต์คะแนนที่ได้จากจำนวนคำตอบที่ถูกต้อง
  percentage = score / len(correct_list) * 100
  return percentage
grade_exam(['a','b','d','a','c'], ['a','a','b','d','a'])
# (1, [1, 0, 0, 0, 0])
20.0
grade_exam(['a','b','d','a','c'], ['a','b','d','a','c'])
# (5, [1, 1, 1, 1, 1])
100.0

ข้อ 7. เปลี่ยนตัว#

# วิธีที่ 1
def sub_name(old_guest, new_guest, guest_list):
    # หาดัชนีของแขกเก่าใน guest_list
    index = guest_list.index(old_guest)
    # ลบชื่อแขกเก่าออกจาก guest_list
    guest_list.remove(old_guest)
    # แทรกชื่อแขกใหม่ลงใน guest_list ที่ดัชนีเดียวกับแขกเก่า
    guest_list.insert(index, new_guest)
name_list = ["Tony", "Elan", "Bee", "Bonus", "Jane"]
sub_name("Bee", "Thomas", name_list)
print(name_list)
['Tony', 'Elan', 'Thomas', 'Bonus', 'Jane']
# วิธีที่ 2
def sub_name(old_guest, new_guest, guest_list):
    # 1. หาชื่อกับตำแหน่งของคนที่มาไม่ได้ => for loop โดยใช้ index
    # 2. แทนชื่อของคนนั้นด้วยชื่อของคนมาได้แทน => ใช้ index ในการเปลี่ยน
    # เช่น list = ['A', 'B', 'C'] สามารถเปลี่ยนค่าแรกของ list ได้โดย list[0] = 'D'
		for i in range(len(guest_list)):
				if guest_list[i] == old_guest:
						guest_list[i] = new_guest
		print(guest_list)

ข้อ 8. คำนวณสถิติ#

# วิธีที่ 1
def stats_summary(number_list):
  min_stat = min(number_list)
  max_stat = max(number_list)
  range_stat = max_stat - min_stat
  index_med = len(number_list) // 2
  median = sorted(number_list)[index_med]
  mean = sum(number_list) / len(number_list)
  print (f'Min = {min_stat}\nMax = {max_stat}\nRange = {range_stat}\nMedian = {median}\nMean = {mean}')
score_nlps = [6, 5, 10, 8, 7, 11, 5.5, 4, 8, 9, 11]
stats_summary(score_nlps)
# Min = 4
# Max = 11
# Range = 7
# Median = 8
# Mean = 7.68
Min = 4
Max = 11
Range = 7
Median = 8
Mean = 7.681818181818182
# วิธีที่ 2
def stats_summary(number_list):
    sorted_list = sorted(number_list)
    min = sorted_list[0]
    max = sorted_list[-1]
    range = max-min
    median = sorted_list[len(number_list) // 2]
    mean = sum(number_list) / len(number_list)
    ### หรือสามารถหา mean ด้วยการ for loop อัปเดตค่าเข้าตัวแปรเรื่อย ๆ
    summary = 0
    for number in number_list:
        summary += number
    mean = summary / len(number_list)

    print('Min = ', min)
    print('Max = ' + str(max))
    print(f'Range = {range}')
    print(f'Median = {median}')
    print(f'Mean = {mean}')

ข้อ 9. เลือกคำ#

# วิธีที่ 1
def select_words_from_mask(word_list, mask_list):
    """ Select words from a list

    Example

    >>> tokenized_sentence = ['She', 'went', 'to', 'eat', 'pizza', 'at', 'Huahin' ,'yesterday']
    >>> mask = [0, 0, 0, 0, 1, 0, 1, 0]
    >>> select_words_from_mask(tokenized_sentence, mask)
    ['pizza', 'Huahin']
    """
    """
    แนวทางการคิด
    1. เช็คว่าใช่คำที่เราสนใจมั้ย
    2. append เข้าไปในลิสต์ใหม่
    3. return ลิสต์ใหม่
    """
    result_list = []
    for i in range(len(word_list)):
      word = word_list[i]
      mask = mask_list[i]
      if mask == 0:
        pass
      else:
        result_list.append(word)
    return result_list
tokenized_sentence = ['She', 'went', 'to', 'eat', 'pizza', 'at', 'Huahin' ,'yesterday']
mask = [0, 0, 0, 0, 1, 0, 1, 0]
select_words_from_mask(tokenized_sentence, mask)
['pizza', 'Huahin']
# วิธีที่ 2
def select_words_from_mask(word_list, mask_list):
    # create a list of interest words
    result = []
    for i in range(len(word_list)):
      if mask_list[i] == 1:
        result.append(word_list[i])
    return result
# วิธีที่ 3: for loop แบบ enumerate
def select_words_from_mask(word_list, mask_list):
    # create a list of interest words
    result = []
    for i, word in enumerate(word_list):
      if mask_list[i] == 1:
        result.append(word)
    return result

โจทย์เรื่องดิกชันนารี#

ข้อ 1. ตัดเกรด#

def assign_grades(midterm, final):
    result_dict = {}

    # หานักเรียนที่เข้าสอบกลางภาคหรือสอบปลายภาคเท่านั้น
    for student in midterm.keys():
        if student not in final.keys():
            result_dict[student] = 'M'
    for student in final.keys():
        if student not in midterm.keys():
            result_dict[student] = 'M'

    # สำหรับนักเรียนที่เข้าสอบทั้งสองครั้ง
    for student in midterm.keys():
        if student in final.keys():
            midterm_score = midterm[student]
            final_score = final[student]
            if midterm_score > 5 and final_score > 5:
                result_dict[student] = 'A'
            elif midterm_score > 5 or final_score > 5:
                result_dict[student] = 'B'
            elif midterm_score <= 5 and final_score <= 5:
                result_dict[student] = 'C'

    return result_dict
midterm = {'Rick': 5.5, 'Michonne': 2, 'Carol': 9, 'Daryl': 7}
final = {'Rick': 6, 'Michonne': 5, 'Carol': 4}
assign_grades(midterm, final)
{'Daryl': 'M', 'Rick': 'A', 'Michonne': 'C', 'Carol': 'B'}

ข้อ 2. Recode part 1#

def recode_word(word_list, word_to_index):
    """
    This function takes a list of words and a dictionary that maps word to index
    This function must return a tuple of (index list, updated dictionary)

    ตัวอย่าง
    >>> recode_word(['cat', 'mat', 'cat'], {'cat': 0, 'mat':1})
    ([0, 1, 0], {'cat': 0, 'mat':1})

    >>> recode_word(['cat', 'bat', 'mat', 'cat', 'eat'], {'cat': 0, 'mat':1})
    ([0, 2, 1, 0, 3], {'cat': 0, 'mat':1, 'bat': 2, 'eat': 3})
    """
    coded_word_list = []
    for word in word_list:
        # ตรวจสอบว่าคำอยู่ใน dict หรือไม่
        if word in word_to_index.keys():
            # ถ้าใช่ ใช้รหัสจาก dict
            code = word_to_index[word]
        else:
            # หาค่ารหัสสูงสุดใน dict
            max_code = max(word_to_index.values())
            # สร้างรหัสใหม่โดยเพิ่ม 1 จากค่ารหัสสูงสุด
            new_code = max_code + 1
            # เพิ่มคำใหม่และรหัสใหม่เข้าใน dict
            word_to_index[word] = new_code
            code = word_to_index[word]
        # เพิ่มรหัสลงในลิสต์รหัส
        coded_word_list.append(code)
    # คืน tuple ของรายการรหัสและ dict ที่อัปเดต
    return (coded_word_list, word_to_index)
recode_word(['cat', 'mat', 'cat'], {'cat': 0, 'mat':1})
([0, 1, 0], {'cat': 0, 'mat': 1})
recode_word(['cat', 'bat', 'mat', 'cat', 'eat'], {'cat': 0, 'mat':1})
([0, 2, 1, 0, 3], {'cat': 0, 'mat': 1, 'bat': 2, 'eat': 3})

ข้อ 3. Recode part 2#

def inverse_recode(index_list, word_to_index):
    """
    ตัวอย่าง
    >>> inverse_recode([0, 2, 1, 0, 3], {'cat': 0, 'mat':1, 'bat': 2, 'eat': 3})
    ['cat', 'bat', 'mat', 'cat', 'eat']
    """
    result_list = []
    
    # วนลูปดัชนีแต่ละตัวในรายการ index_list
    for index in index_list:
        # หาคำที่มีค่าดัชนีเท่ากับดัชนีที่กำหนด
        for key, value in word_to_index.items():
            if value == index:
                word = key
        # เพิ่มคำลงในรายการผลลัพธ์
        result_list.append(word)
    # คืนค่ารายการคำที่แปลงกลับมาจากดัชนี
    return result_list
inverse_recode([0, 2, 1, 0, 3], {'cat': 0, 'mat':1, 'bat': 2, 'eat': 3})
['cat', 'bat', 'mat', 'cat', 'eat']

ข้อ 4.#

def count_fruits(count1, count2):
    """
    ตัวอย่าง
    >>> count_fruits({"apple": 1, "banana": 2}, {"apple": 3, "banana": 4})
    {"apple": 4, "banana": 6}
    >>> count_fruits({"apple": 5, "banana": 7, "papaya": 9}, {"apple": 3, "banana": 5, "papaya": 7}) 
    {"apple": 8, "banana": 12, "papaya": 16}
    """
    result_dict = {}
    # วนลูปผ่านคีย์และค่าของรายการแรก
    for key1, value1 in count1.items():
        # หาค่าของผลไม้ในรายการที่สองโดยใช้คีย์จากรายการแรก
        value2 = count2[key1]
        # รวมค่าของผลไม้และเพิ่มเข้าใน result_dict
        result_dict[key1] = value1 + value2
    return result_dict
count_fruits({"apple": 1, "banana": 2}, {"apple": 3, "banana": 4})
{'apple': 4, 'banana': 6}
count_fruits({"apple": 5, "banana": 7, "papaya": 9}, {"apple": 3, "banana": 5, "papaya": 7}) 
{'apple': 8, 'banana': 12, 'papaya': 16}

ข้อ 5. สนุกกำลังสอง#

def squared_dict(num):
    # สร้าง dict เปล่าเพื่อเก็บค่าที่ต้องการเข้าไป
    result = {}

    # วนลูปผ่านตัวเลขที่รับมา
    for i in range(num):
        number = i + 1
        # สร้างคีย์ใหม่โดยใช้ค่าดัชนีของตัวเลขที่วนลูปและคำนวณเลขยกกำลังสองแล้วใส่เป็นค่าของคีย์นั้น
        # result[i+1]  = (i+1) ** 2
        result[number] = number ** 2
    return result
squared_dict(5)
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

ข้อ 6. สร้าง dictionary#

# วิธีที่ 1
def make_en_th_dictionary(english_list, thai_list):
    # สร้าง dict เปล่า
    result = {}

    # for loop index ไปบน list of english word
    for i in range(len(english_list)):
        english_word = english_list[i]
        # get คำภาษาไทยโดยการเทียบ index
        thai_word = thai_list[i]
        # assign คำภาษาอังกฤษเป็น key, คำภาษาไทยเป็น value
        result[english_word] = thai_word

    return result
# วิธีที่ 2
def make_en_th_dictionary(english_list, thai_list):
    result = {}
    # for loop บน 2 list พร้อมกัน
    for english_word, thai_word in zip(english_list, thai_list):
        result[english_word] = thai_word
    return result
english_list = ['computer', 'dog', 'floor']
thai_list = ['คอมพิวเตอร์', 'หมา', 'พื้น']
make_en_th_dictionary(english_list, thai_list)
{'computer': 'คอมพิวเตอร์', 'dog': 'หมา', 'floor': 'พื้น'}

ข้อ 7. Simplify#

def simplify_eng(text):
    censor_dict = {
        'utilize': 'use',
        'eulogize': 'praise',
        'annihilate': 'destroy',
        'apprise': 'warn',
        'impending': 'upcoming'
    }
    
    # แปลง text เป็น list of words
    list_of_words = text.split(" ")

    # for loop index ไปบน list of english word
    for i in range(len(list_of_words)):
      # สร้างตัวแปร word จากการใช้ index บน ลิสต์
      word =  list_of_words[i]
      # เช็คว่า word อยู่ใน censor_dict ไหม
      if word in censor_dict:
        list_of_words[i] = censor_dict[word] # เอาคำที่ง่าย ไปแทนที่คำที่ยากในตำแหน่งบน list_of_words
      else:
        pass
    return ' '.join(list_of_words) # ประกอบสมาชิกใน list ให้เป็น string
text = 'I utilize chopsticks for eating'
simplify_eng(text)
'I use chopsticks for eating'

โจทย์เรื่องเซ็ต#

ข้อ 1 - คำที่ไม่ซ้ำ#

def unique_words(text):
    """
    >>> unique_words('hello world and practice makes perfect and hello world again')
    'again|and|hello|makes|perfect|practice|world'
    """
    tokens = text.split(" ")  # แยกข้อความเป็น token ด้วยช่องว่าง
    token_set = set(tokens)  # สร้างเซ็ตของ token ที่ไม่ซ้ำกัน
    sort_words_list = sorted(list(token_set))  # เรียงลำดับคำและแปลงกลับเป็นลิสต์
    sort_words = '|'.join(sort_words_list)  # รวมคำในลิสต์ด้วยเครื่องหมาย |
    return sort_words
text = 'hello world and practice makes perfect and hello world again'
unique_words(text)
'again|and|hello|makes|perfect|practice|world'

ข้อ 2 - ตัวอักษรที่ไม่ซ้ำ#

def is_all_distinct_characters(word):
    """
    Examples:
    >>> is_all_distinct_characters('abc')
    True    
    >>> is_all_distinct_characters('aA')
    True
    >>> is_all_distinct_characters('abca')
    False
    >>> is_all_distinct_characters('Alexander') # ตัว e ซ้ำ
    False
    """
    # นับจำนวนตัวอักษรเดิม
    original_length = len(word)
    unique_character_set = set()
    # สร้างเซตเพื่อเก็บตัวอักษรที่ไม่ซ้ำกัน
    for char in word:
        unique_character_set.add(char)
    # นับจำนวนตัวอักษรที่ไม่ซ้ำกัน
    unique_length = len(unique_character_set)

    # เปรียบเทียบจำนวนตัวอักษรเดิมและจำนวนตัวอักษรที่ไม่ซ้ำกัน
    if original_length != unique_length:
        return False
    else:
        return True
print(is_all_distinct_characters('abc'))
print(is_all_distinct_characters('aA'))
print(is_all_distinct_characters('abca'))
print(is_all_distinct_characters('Alexander'))
True
True
False
False

ข้อ 3 - สินค้าที่ร้านอื่นไม่มี#

def find_business_opportunities(storeA_items, storeB_items):
    """
    
    Examples:
    >>> list1 = ['razor blade', 'soap', 'shampoo', 'liquid detergent', 'toothbrush']
    >>> list2 = ['soap', 'conditioner', 'shampoo', 'toothpaste']
    >>> find_business_opportunities(list1, list2)
    ['razor blade', 'liquid detergent', 'toothbrush']
    """
    # สร้างเซ็ตของสินค้าในร้าน A และร้าน B
    items_A_set = set(storeA_items)
    items_B_set = set(storeB_items)
    # หาสินค้าที่มีเฉพาะในร้าน A โดยไม่มีในร้าน B
    only_A_set = items_A_set - items_B_set
    # แปลงกลับเป็นลิสต์และคืนค่า
    return list(only_A_set)
list1 = ['razor blade', 'soap', 'shampoo', 'liquid detergent', 'toothbrush']
list2 = ['soap', 'conditioner', 'shampoo', 'toothpaste']
find_business_opportunities(list1, list2)
['toothbrush', 'liquid detergent', 'razor blade']

ข้อ 4 - Out of vocabulary#

# 1) แบบใช้ for loop ลงไปบน word_list
def count_oov_words(word_list, vocab_set):
  invocab_list = [w for w in word_list if w in vocab_set]
  return len(word_list) - len(invocab_list)

# 2) แปลง word_list ให้เป็นเซ็ต จากนั้นใช้เซ็ต operation แก้โจทย์
def count_oov_words2(word_list, vocab_set):
  word_set = set(word_list)
  notinvocab_set = vocab_set.intersection(word_set)
  return len(word_list) - len(notinvocab_set)
word_list = ['cat','sun','dog','sea']
vocab_set = {'cat','sun'}
print(count_oov_words(word_list, vocab_set))
print(count_oov_words2(word_list, vocab_set))
2
2

ข้อ 5 - Dinner#

# 1) แบบใช้ for loop ลงไปบน list
def agree_dinner(list1, list2, list3):
  agree_list = [item for item in list1 if (item in list2) and (item in list3)]
  return agree_list

# 2) แปลง list ให้เป็นเซ็ต จากนั้นใช้เซ็ต operation แก้โจทย์
def agree_dinner2(list1, list2, list3):
  agree_set = (set(list1).intersection(set(list2))).intersection(set(list3))
  return list(agree_set)
agree_dinner2(
  ['thai', 'chinese', 'japanese', 'shabu'],
  ['shabu', 'japanese', 'yakiniku', 'italian'],
  ['greek', 'shabu', 'chinese', 'japanese']
)
['japanese', 'shabu']