เฉลยโจทย์: โครงสร้างข้อมูลซ้อนใน#
เรื่องลิสต์ซ้อนลิสต์#
ข้อ 1#
def sum_scores(score_lists):
"""
>>> sum_scores([[10, 15, 30, 15], [2, 12, 25, 18]])
[True, False]
"""
result = []
for scores in score_lists:
# วนซ้ำผ่านลิสต์ภายใน score_lists เพื่อคำนวณผลรวมของเลขในแต่ละลิสต์
total_score = sum(scores)
# เก็บค่าความสำเร็จของนักเรียน (ผ่านหรือไม่ผ่าน) เป็นค่าบูลีนในลิสต์ result
result.append(total_score >= 60)
return result
ข้อ 2#
def process_paragraph(sentence_list):
"""
>>> process_paragraph(['This is a sentence.', 'This is another sentence.'])
[['This', 'is', 'a', 'sentence.'], ['This', 'is', 'another', 'sentence.']]
"""
result = []
# ลูปผ่านแต่ละประโยคใน sentence_list
for sentence in sentence_list:
# แบ่งประโยคเป็นคำๆ โดยใช้ช่องว่างเป็นตัวแบ่ง และเพิ่มลิสต์ของคำในแต่ละประโยคเข้าไปใน result
result.append(sentence.split(' '))
# คืนค่าผลลัพธ์ที่เป็นลิสต์ของลิสต์ของคำ
return result
ข้อ 3#
def get_min_max_sentence_length(sentence_list):
"""
>>> get_min_max_sentence_length(['short sentence.', 'This is a very long long long sentence.', 'a normal sentence here', 'another normal sentence'])
(2, 8)
"""
word_counts = []
# ใช้ลูปเพื่อหาจำนวนคำในแต่ละประโยค
for sentence in sentence_list:
words = sentence.split()
word_counts.append(len(words))
# หาค่าต่ำสุดและค่าสูงสุด
min_words = min(word_counts)
max_words = max(word_counts)
return (min_words, max_words)
ข้อ 4#
def limit_sentence_lengths(sentence_list, min_words, max_words):
"""
รับลิสต์ของประโยค และกรองประโยคตามจำนวนคำขั้นต่ำและสูงสุดที่กำหนด
>>> limit_sentence_lengths(['short sentence', 'This is a very long long long sentence', 'a normal sentence here', 'another normal sentence'], 2, 4)
['This is a very', 'a normal sentence here', 'another normal sentence']
"""
filtered_sentences = []
for sentence in sentence_list:
words = sentence.split() # แยกคำในประโยค
word_count = len(words) # นับจำนวนคำ
if word_count > min_words:
if word_count > max_words:
# ตัดประโยคให้เหลือคำตามจำนวนสูงสุดที่กำหนด
filtered_sentences.append(' '.join(words[:max_words]))
else:
# เก็บประโยคที่ผ่านเงื่อนไขไว้ในลิสต์
filtered_sentences.append(sentence)
return filtered_sentences
ข้อ 5#
import re
def tokenize_clean(sentences, stopset):
"""
>>> tokenize_clean(['ฉัน|รัก|การ|เขียน|โปรแกรม|Python', 'ใน|ที่|สุด|ก็|สำเร็จ'], {'ฉัน', 'การ', 'ใน', 'ที่', 'ก็'})
[['รัก', 'เขียน', 'โปรแกรม'], ['สำเร็จ']]
"""
result = []
for sentence in sentences: # วนซ้ำในแต่ละประโยคในลิสต์
words = sentence.split('|') # แบ่งประโยคออกเป็นคำโดยใช้ '|' เป็นตัวคั่น
clean_words = [] # สร้างลิสต์ว่างเพื่อเก็บคำที่ผ่านการกรองแล้ว
for word in words: # วนซ้ำในแต่ละคำในประโยค
if word not in stopset and re.match(r'[ก-์]', word): # ตรวจสอบว่าคำไม่อยู่ใน stopset และเป็นตัวอักษรภาษาไทย
clean_words.append(word) # ถ้าผ่านการตรวจสอบ ให้เพิ่มคำลงในลิสต์ clean_words
result.append(clean_words) # เพิ่มลิสต์คำที่ผ่านการกรองแล้วลงในลิสต์ผลลัพธ์
return result # คืนค่าลิสต์ผลลัพธ์
ข้อ 6#
def calculate_ratio_3_chars(sentences):
"""
>>> calculate_ratio_3_chars([['Stay', 'in', 'the', 'middle'],['Like','you', 'a', 'little'], ["Don't", 'want','no','riddle']])
0.25
"""
# ตัวแปรนับจำนวนคำที่สั้นกว่าสามตัวอักษร
short_word_count = 0
# ตัวแปรนับจำนวนคำทั้งหมด
total_word_count = 0
# วนซ้ำในแต่ละประโยคในลิสต์ของประโยค
for sentence in sentences:
# วนซ้ำในแต่ละคำในประโยค
for word in sentence:
total_word_count += 1 # เพิ่มจำนวนคำทั้งหมด
if len(word) < 3: # ถ้าคำสั้นกว่าสามตัวอักษร
short_word_count += 1 # เพิ่มจำนวนคำที่สั้นกว่าสามตัวอักษร
# คำนวณร้อยละของคำที่สั้นกว่าสามตัวอักษร
ratio = short_word_count / total_word_count
return ratio # คืนค่าร้อยละที่คำนวณได้
ข้อ 7#
def get_male_nicknames(students):
"""
>>> get_male_nicknames([('Maysa', 'May', 'Female'),('Waruntorn', 'Ing', 'Female'),('Maysaya', 'May', 'Female'), ('Watsakorn', 'May', 'Female'),('Chonkan', 'Atom', 'Male'),('Saran', 'Ton', 'Male'), ('Tonkid', 'Ton', 'Male')])
['Atom', 'Ton']
"""
# สร้างเซตเพื่อเก็บชื่อเล่นของผู้ชายที่ไม่ซ้ำกัน
male_nicknames = set()
# วนซ้ำผ่านลิสต์ของนักเรียน
for full_name, nickname, gender in students:
# ถ้าเพศเป็นชาย
if gender == 'Male':
# เพิ่มชื่อเล่นลงในเซต
male_nicknames.add(nickname)
# แปลงเซตเป็นลิสต์และเรียงลำดับตามพจนานุกรม
sorted_nicknames = sorted(male_nicknames)
return sorted_nicknames # คืนค่าลิสต์ที่เรียงลำดับแล้ว
เรื่องลิสต์ของดิกชันนารีคู่ฟิลด์แวลู#
ข้อ 1#
def sum_comments_for_id(tweet_id, tweet_list):
"""
>>> sum_comments_for_id('BarackObama', data)
42000
"""
total_comments = 0 # ตัวแปรสำหรับเก็บจำนวนคอมเมนต์ทั้งหมด
# วนซ้ำผ่านลิสต์ของทวีต
for tweet in tweet_list:
# ถ้าไอดีของทวีตตรงกับไอดีที่กำหนด
if tweet['id'] == tweet_id:
# บวกจำนวนคอมเมนต์ของทวีตนี้เข้าไปใน total_comments
total_comments += tweet['num comments']
return total_comments # คืนค่าจำนวนคอมเมนต์ทั้งหมด
ข้อ 2#
def tag_thai_sites(site_dict_list):
"""
>>> tag_thai_sites(data)
[
{'title': 'Welcome to Zentrale', 'url': 'www.zen-zen.co.th','big Thai site': True},
{'title': 'Apply now for better life', 'url': 'www.betterlife.co.th', 'big Thai site': False },
{'title': 'We have everything you want.', 'url': 'www.everything.com', 'big Thai site': False}
]
"""
updated_sites = []
for site in site_dict_list:
title = site.get('title', '').lower()
url = site.get('url', '')
viewer = site.get('viewer', {})
# เงื่อนไข 1: เอาออกถ้า 'title' มีคำว่า 'men' หรือ 'women'
if 'men' in title or 'women' in title:
continue
# เงื่อนไข 2: ตรวจสอบ '.co.th' และจำนวนผู้เข้าชมรวม
total_viewers = sum(viewer.values())
if '.co.th' in url:
site['big Thai site'] = total_viewers > 30000
else:
site['big Thai site'] = False
# เงื่อนไข 3: ลบฟิลด์ 'viewer' ออก
site.pop('viewer', None)
updated_sites.append(site)
return updated_sites
เรื่องดิกชันนารีซ้อนใน#
ข้อ 1#
def list_contact(contacts):
"""
>>> list_contact({
'Alex' : {'phone': '123-456-789', 'line': 'alexcool'},
'Bo': {'home phone': '111-222-3333', 'line': 'bobo'},
'Chris': {'phone': '444-555-6666', 'line': 'chrissie'},
'Doug': {'mobile phone': '444-555-6666', 'line': 'dougd'}
})
[('Alex', 'alexcool'), ('Bo', 'bobo'), ('Chris', 'chrissie'), ('Doug', 'dougd')]
"""
# สร้างลิสต์ของทูเปิล (name, line id) จากดิกชันนารี
contact_list = [(name, info['line']) for name, info in contacts.items()]
# เรียงลำดับตามอักษรของชื่อ
contact_list.sort()
return contact_list
ข้อ 2#
def lookup_by_lastname(last_name, data):
"""
>>> name_to_phone = { ('Mark', 'Wahlberg') : '111-222-3333',
('Jane', 'Doe'): '222-333-4444',
('Jane', 'Eyre'): '333-444-5555'
}
>>> lookup_by_lastname('Doe', name_to_phone_numbers)
'222-333-4444'
"""
# วนซ้ำในดิกชันนารีเพื่อตรวจสอบนามสกุล
for (first_name, surname), phone_number in data.items():
if surname == last_name:
return phone_number
return None
ข้อ 3#
name_to_age = {'ชญา': 33,
'อรรถพล': 34,
'โนโซมิ': 34}
def transform_to_age_to_name(name_to_age):
age_to_name = {}
# วนซ้ำในดิกชันนารี name_to_age เพื่อเข้าถึงชื่อและอายุ
for name, age in name_to_age.items():
# ถ้าคีย์ age ยังไม่มีใน age_to_name ให้สร้างลิสต์ใหม่
if age not in age_to_name:
age_to_name[age] = []
# เพิ่มชื่อเข้าไปในลิสต์ของคีย์ age
age_to_name[age].append(name)
# คืนค่าดิกชันนารี age_to_name ที่แปลงเสร็จแล้ว
return age_to_name
ข้อ 4#
name_to_phone = { ('Mark', 'Wahlberg') : '111-222-3333',
('Jane', 'Doe'): '222-333-4444',
('Jane', 'Eyre'): '333-444-5555'
}
def transform_to_last_name_keys(name_to_phone):
last_name_to_phone = {}
# วนซ้ำในดิกชันนารี name_to_phone เพื่อเข้าถึงชื่อและเบอร์โทรศัพท์
for (first_name, last_name), phone in name_to_phone.items():
# ถ้าคีย์ last name ยังไม่มีใน last_name_to_phone ให้สร้างลิสต์ใหม่
if last_name not in last_name_to_phone:
last_name_to_phone[last_name] = []
# เพิ่มเบอร์โทรศัพท์เข้าไปในลิสต์ของคีย์ last name
last_name_to_phone[last_name].append(phone)
# คืนค่าดิกชันนารี last_name_to_phone ที่แปลงเสร็จแล้ว
return last_name_to_phone
ข้อ 5#
def list_all_students(registration):
"""
>>> registration = {'CompLing': ['Andy', 'Brittney', 'Catherine'],
'SoundSys': ['Andy', 'Brittney', 'Donald', 'Elaine', 'Fodor'],
'GramSys': ['Brittney', 'Girth', 'Harry'],
'ManGeog': ['Andy', 'Donald', 'Girth']
}
>>> list_all_students(registration)
['Andy', 'Brittney', 'Catherine', 'Donald', 'Elaine', 'Fodor', 'Girth', 'Harry']
"""
# สร้างเซตเปล่าเพื่อเก็บชื่อนักเรียนที่ไม่ซ้ำกัน
student_set = set()
# วนซ้ำในดิกชันนารี registration เพื่อเข้าถึงลิสต์ชื่อนักเรียนในแต่ละวิชา
for students in registration.values():
# เพิ่มชื่อนักเรียนในเซต student_set (การเพิ่มเข้าเซตจะทำให้ไม่มีชื่อนักเรียนซ้ำกัน)
student_set.update(students)
# แปลงเซต student_set เป็นลิสต์และเรียงลำดับชื่อนักเรียนตามลำดับตัวอักษร
student_list = sorted(student_set)
# คืนค่าลิสต์ชื่อนักเรียนที่เรียงลำดับแล้ว
return student_list
ข้อ 6#
def get_num_classes_to_students(registration):
"""
Example:
>>> registration = {'CompLing': ['Andy', 'Brittney', 'Catherine'],
'SoundSys': ['Andy', 'Brittney', 'Donald', 'Elaine', 'Fodor'],
'GramSys': ['Brittney', 'Girth', 'Harry'],
'ManGeog': ['Andy', 'Donald', 'Girth']
}
>>> get_num_classes_to_students(registration)
{3: ['Andy', 'Brittney'],
2: ['Donald', 'Girth'],
1: ['Catherine', 'Elaine', 'Fodor', 'Harry']}
"""
student_classes_count = {}
# วนซ้ำในดิกชันนารี registration เพื่อเก็บจำนวนคลาสที่นักเรียนลงทะเบียนเรียน
for students in registration.values():
for student in students:
if student in student_classes_count:
student_classes_count[student] += 1
else:
student_classes_count[student] = 1
# สร้างดิกชันนารีเพื่อเก็บจำนวนคลาสและลิสต์นักเรียนที่ลงเรียนตามจำนวนคลาสนั้นๆ
num_classes_to_students = {}
# วนซ้ำในดิกชันนารี student_classes_count เพื่อสร้างดิกชันนารี num_classes_to_students
for student, count in student_classes_count.items():
if count in num_classes_to_students:
num_classes_to_students[count].append(student)
else:
num_classes_to_students[count] = [student]
# คืนค่าดิกชันนารี num_classes_to_students
return num_classes_to_students
ข้อ 7#
def combine_dicts(d1, d2):
combined = {}
# วนซ้ำในดิกชันนารี d1 เพื่อเพิ่มค่าใน combined
for key, value in d1.items():
if key in combined:
combined[key].append(value)
else:
combined[key] = [value]
# วนซ้ำในดิกชันนารี d2 เพื่อเพิ่มค่าใน combined
for key, value in d2.items():
if key in combined:
combined[key].append(value)
else:
combined[key] = [value]
return combined
ข้อ 8#
def find_missing_work(data):
"""
>>> find_missing_work( {'PA1': ['Bew', 'Mild', 'Nipun'],
'PA2': ['Mild', 'Bew', 'PP'],
'PA3': ['Bew', 'Nipun', 'Mild'] } )
['Nipun', 'PP']
"""
# สร้างเซตเพื่อเก็บชื่อนิสิตทั้งหมดที่ส่งการบ้านอย่างน้อยหนึ่งชิ้น
all_students = set()
# สร้างดิกชันนารีเพื่อตรวจสอบการส่งการบ้านของนิสิตแต่ละคน
student_work_count = {}
# วนซ้ำในดิกชันนารี data เพื่อเก็บชื่อนิสิตและนับจำนวนการส่งการบ้าน
for homework, students in data.items():
for student in students:
all_students.add(student)
if student in student_work_count:
student_work_count[student] += 1
else:
student_work_count[student] = 1
# สร้างลิสต์เพื่อเก็บชื่อนิสิตที่ส่งการบ้านไม่ครบ
missing_work_students = []
# นับจำนวนการบ้านทั้งหมด
total_homeworks = len(data)
# วนซ้ำในดิกชันนารี student_work_count เพื่อหานิสิตที่ส่งการบ้านไม่ครบ
for student, count in student_work_count.items():
if count < total_homeworks:
missing_work_students.append(student)
return missing_work_students