เฉลยโจทย์: โครงสร้างข้อมูลซ้อนใน#

เรื่องลิสต์ซ้อนลิสต์#

ข้อ 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