เฉลยแบบฝึกหัด: โครงสร้างข้อมูล 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']