Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python Group Anagrams จากรายการที่กำหนด


ในบทช่วยสอนนี้ เราจะเขียนโปรแกรมที่จัดกลุ่มแอนนาแกรมทั้งหมดในรายการ อันดับแรก มาดูกันว่า แอนนาแกรมคืออะไร .

สองสตริงที่มีอักขระเหมือนกันในลำดับที่ต่างกันเรียกว่าแอนนาแกรม

ก่อนดำดิ่งสู่การแก้ปัญหา มาดูตัวอย่างกัน

อินพุต

['cat', 'dog', 'fired', 'god', 'pat', 'tap', 'fried', 'tac']

ผลลัพธ์

[['cat', 'tac'], ['dog', 'god'], ['fried', 'fired'], ['pat', 'tap']]

เราจะแบ่งปัญหาออกเป็นสองส่วน ขั้นแรกเราจะเขียนฟังก์ชันที่ตรวจสอบสองสตริงว่าเป็นแอนนาแกรมหรือไม่ ทำตามขั้นตอนด้านล่างเพื่อเขียนโค้ดเพื่อตรวจสอบแอนนาแกรม

  • เริ่มต้นสตริง
  • เรียงลำดับทั้งสองสตริง
  • หากสตริงที่จัดเรียงทั้งสองมีค่าเท่ากัน ให้คืนค่า True อื่น เท็จ .

ตัวอย่าง

# simple lambda function to check whether two strings are anagrams or not
are_anagrams = lambda x, y: str(sorted(x.lower())) == str(sorted(y.lower()))
# calling the function
print(are_anagrams('cat', 'tac'))
print(are_anagrams('cat', 'Tac'))
print(are_anagrams('cat', 'dog'))

ผลลัพธ์

หากคุณเรียกใช้โค้ดด้านบน คุณจะได้ผลลัพธ์ดังต่อไปนี้

True
True
False

ตอนนี้ เรารู้วิธีตรวจสอบสองสตริงแล้วว่าเป็นแอนนาแกรมหรือไม่ แต่นั่นยังไม่เพียงพอที่จะแก้ปัญหาของเราได้ เราจำเป็นต้องจัดกลุ่ม (จัดเก็บ) แอนนาแกรมทั้งหมดจากรายการเป็นรายการย่อย

เราจะแก้ปัญหาได้อย่างไร

แนวทางปฏิบัติที่ดีที่สุดคือการใช้พจนานุกรมเพื่อจัดกลุ่มองค์ประกอบ เราจะมีคีย์เดียวสำหรับแอนนาแกรมที่เกี่ยวข้อง มันค่อนข้างสับสนถ้าคุณยังใหม่กับ Python เรามาดูขั้นตอนเพื่อให้บรรลุสิ่งที่เราต้องการกันเถอะ

  • เริ่มต้นรายการสตริง
  • เริ่มต้นพจนานุกรมเปล่า
  • ทวนซ้ำในรายการ
    • จัดเรียงสตริง
    • ตรวจสอบว่ามีอยู่ในพจนานุกรมหรือไม่

      • หากมีอยู่ในพจนานุกรม ให้ต่อท้ายสตริงในรายการ
    • อย่างอื่นเริ่มต้นคีย์ด้วยรายการรวมถึงสตริงปัจจุบันเพื่อเก็บแอนนาแกรม
  • พิมพ์ค่าทั้งหมดของพจนานุกรมในรายการ

ตัวอย่าง

# initialzing a list of strings
anagrams = ['cat', 'dog', 'fired', 'god', 'pat', 'tap', 'fried', 'tac']
# initializing an empty dict
grouped_anagrams = {}
# iterating over the list to group all anagrams
for string in anagrams:
   # sorting the string
   sorted_string = str(sorted(string))
   # checking the string in dict
   if sorted_string in grouped_anagrams:
      # adding the string to the group anagrams
      grouped_anagrams[sorted_string].append(string)
      else:
         # initializing a list with current string
         grouped_anagrams[sorted_string] = [string]
# printing the values of the dict (anagram groups)
print(list(grouped_anagrams.values()))

ผลลัพธ์

หากคุณเรียกใช้โค้ดด้านบน คุณจะได้ผลลัพธ์ดังต่อไปนี้

[['dog', 'god'], ['pat', 'tap'], ['cat', 'tac'], ['fired', 'fried']]

บทสรุป

คุณสามารถแก้ปัญหาโดยใช้วิธีการต่างๆ ได้เช่นกัน มีโครงสร้างข้อมูลที่เรียกว่า defaultdict ที่ช่วยให้คุณหลีกเลี่ยงการตรวจสอบคีย์ในพจนานุกรม คุณสามารถสำรวจและเปลี่ยนรหัสตามนั้นได้

หากคุณมีข้อสงสัยใดๆ ในบทแนะนำ โปรดระบุในส่วนความคิดเห็น