เฉลยโจทย์: Comprehension#

ข้อ 1: List comprehension 1#

จงเปลี่ยนลิสต์ของชื่อให้เป็นลิสต์ที่มีแต่ชื่อภาษาอังกฤษ และชื่อภาษาอังกฤษจะต้องถูกเปลี่ยนเป็นชื่อที่ขึ้นต้นด้วยตัวใหญ่ที่เหลือตัวเล็กทั้งหมด ให้เขียนสองแบบ

  • แบบแรกให้เขียนโดยใช้ for loop ธรรมดา

  • แบบที่สองให้เขียนโดยใช้ list comprehension

names = ['aaron', 'leigH', 'เต้', 'jOHN']
# for loop ธรรมดา
"""
1. สร้างลิสต์ใหม่ (new_list) เพื่อเก็บชื่อที่ฟอร์แมตแล้ว
2. วนลูป (loop) ทุกตัวอักษรในรายชื่อ (names)
3. ฟอร์แมตชื่อภาษาอังกฤษ (eng_name) 
    3.1 ตรวจสอบว่า eng_name เป็นตัวอักษรเล็กทั้งหมดหรือไม่ (islower())
    3.2  ถ้าเป็นตัวอักษรเล็กทั้งหมด ให้แปลงเป็นตัวพิมพ์ใหญ่ตัวแรก (capitalize())
4. เพิ่มชื่อที่ฟอร์แมตแล้ว (eng_name) ลงในรายการใหม่ (new_list)
"""

new_list = []
for name in names:
  if name.lower().islower():
    new_list.append(name.lower().capitalize())

print(new_list)
['Aaron', 'Leigh', 'John']
# List comprehension

new_list = [name.lower().capitalize() for name in names if name.lower().islower()]

print(new_list)
['Aaron', 'Leigh', 'John']

ข้อ 2: List comprehension 2#

Given a list of English words, use list comprehension to create a list of words that are all capitalized. You must also exclude words that are shorter than two characters.

tokens = ['Fruit', 'flies', 'do', 'like', 'bananas', '.']
new_tokens = [token.upper() for token in tokens if len(token) > 2]
print(new_tokens)
['FRUIT', 'FLIES', 'LIKE', 'BANANAS']

ข้อ 3: List comprehension 3#

เขียน List comprehension

  • input เป็นลิสต์ของคำ (strings) เช่น ['monKey', 'roach', 'Eve', 'oo', 'Jim']

  • output ลิสต์ของคำทั้งหมดแต่ว่าให้เอาสระออกให้หมด เช่น ['mnKy', 'rch', 'v', '', 'Jm']

word_list = ['monKey', 'roach', 'Eve', 'oo', 'Jim']
#for loop ธรรมดา
"""
1. วนลูปผ่านทุกตัวอักษรในรายการ inputList
2. กรองสระออกจากคำ
2.1 สร้างสตริงเปล่า
2.2 เพิ่มตัวอักษรแต่ละตัวในคำลงในสตริงเปล่า โดยไม่รวมสระ
2.3 เพิ่มสตริงที่ได้ไปยังรายการ new_list
"""
new_list = []
for word in word_list:
  new_word = ''
  for char in word:
    if char.lower() not in 'aeiou':
      new_word += char
  new_list.append(new_word)

print(new_list)
['mnKy', 'rch', 'v', '', 'Jm']
#list comprehension
new_list = [''.join(char for char in word if char.lower() not in 'aeiou') for word in word_list]

print(new_list)
['mnKy', 'rch', 'v', '', 'Jm']

ข้อ 4: Dictionary comprehension 1#

Given a list words, create a dictionary whose keys are a word and values are the length of the word.

tokens = ['Fruit', 'flies', 'like', 'bananas', '.']
word_to_values = {token:len(token) for token in tokens}
print(word_to_values)
{'Fruit': 5, 'flies': 5, 'like': 4, 'bananas': 7, '.': 1}

ข้อ 5: Dictionary comprehension 2#

Given two lists of words that are translations of each other, create a dictionary whose key is an English and whose value is the French translation of that word. And keep only English words that are longer than 3 characters.

english_words = ['chair', 'pen', 'eraser', 'computer']
french_words = ['chaise', 'stylo', 'gomme', 'ordinateur']
english_to_french = {word: french_words[i] for i, word in enumerate(english_words) if len(word) > 3}
print(english_to_french)
{'chair': 'chaise', 'eraser': 'gomme', 'computer': 'ordinateur'}

ข้อ 6: Dictionary comprehension 3#

จงเขียน dictionary comprehension

  • Input: ลิสต์ของคำ ['baby', 'baby', 'baby', 'oh', '...', 'baby', 'baby', 'no','!']

  • Output: ดิกต์ที่มี key เป็นคำ และ value เป็นอันดับของคำตามความถี่ เช่น {'baby': 1, 'oh': 2, '...': 3, 'no': 4, '!': 5}

Hint: ใช้ Counter นับคำก่อนหลังจากนั้นเขียน dict comprehension โดยใช้ Counter.most_common เป็น input

word_list = ['baby', 'baby', 'baby', 'oh', '...', 'baby', 'baby', 'no','!']
from collections import Counter
word_count = Counter(word_list)
word_count_lst = word_count.most_common()
word_to_rank = {word_n_freq[0]:i+1 for i, word_n_freq in enumerate(word_count_lst)}
print(word_to_rank)
{'baby': 1, 'oh': 2, '...': 3, 'no': 4, '!': 5}