Cartesian Product Python

Cartesian Product เป็นผลคูณของ 2 Metrix ซึ่งถ้ามันเป็นตัวเลขมันก็คูณกันได้ปกติ แต่ถ้ามันเป็น String ละ งานเริ่มงอกแล้วใช่มั้ย ซึ่งในภาษา Python มีตัวช่วยที่เรียกว่า Itertools Product การนำไปใช้ในชีวิตประจำวันที่เห็นกันบ่อย ๆ ก็อย่างเช่น เกมไพ่ ก็จะประกอบไปด้วย Suit กับ Rank แล้วนำมาผสมกัน


Card Game

หากเขียนเป็นภาษา Programming เราจะมี List ที่เป็น String อยู่ 2 อัน โดยแบ่งเป็น หน้า กับ แต้ม ซึ่งเราอาจจะใช้เป็น Tuple ก็ได้ เพราะค่ามันตายตัวอยู่แล้ว ซึ่งเราจะไม่ใช้วิธีสร้างไพ่ทีเดียว 52 ใบ เพราะเราจะเสียเวลาในการสร้าง

suit = ["♣", "♦", "♥", "♠"]
rank = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']

ถ้าเราคูณกันจะได้ผลคูณ Cartesian Product โดยจะต้องวน Loop เพื่อให้ได้ค่าตามตารางนี้

┌──────┬──────┬──────┬──────┐
│ 2  ♣ │ 2  ♦ │ 2  ♥ │ 2  ♠ │
├──────┴──────┴──────┴──────┤
│ 3  ♣ │ 3  ♦ │ 3  ♥ │ 3  ♠ │
├──────┴──────┴──────┴──────┤
│ 4  ♣ │ 4  ♦ │ 4  ♥ │ 4  ♠ │
├──────┴──────┴──────┴──────┤
│ 5  ♣ │ 5  ♦ │ 5  ♥ │ 5  ♠ │
├──────┴──────┴──────┴──────┤
│ 6  ♣ │ 6  ♦ │ 6  ♥ │ 6  ♠ │
├──────┴──────┴──────┴──────┤
│ 7  ♣ │ 7  ♦ │ 7  ♥ │ 7  ♠ │
├──────┴──────┴──────┴──────┤
│ 8  ♣ │ 8  ♦ │ 8  ♥ │ 8  ♠ │
├──────┴──────┴──────┴──────┤
│ 9  ♣ │ 9  ♦ │ 9  ♥ │ 9  ♠ │
├──────┴──────┴──────┴──────┤
│ 10 ♣ │ 10 ♦ │ 10 ♥ │ 10 ♠ │
├──────┴──────┴──────┴──────┤
│ J  ♣ │ J  ♦ │ J  ♥ │ J  ♠ │
├──────┴──────┴──────┴──────┤
│ Q  ♣ │ Q  ♦ │ Q  ♥ │ Q  ♠ │
├──────┴──────┴──────┴──────┤
│ K  ♣ │ K  ♦ │ K  ♥ │ K  ♠ │
├──────┴──────┴──────┴──────┤
│ A  ♣ │ A  ♦ │ A  ♥ │ A  ♠ │
└──────┴──────┴──────┴──────┴

การวนลูปโดยทั่วไป จะต้องวน 2 รอบ เพราะมี List อยู่ 2 ตัว ได้แก่ Suit กับ Rank ประมาณนี้

deck = []
for k in range(0, len(rank)):
    for j in range(0, len(suit)):
        r = rank[k]
        s = suit[j]
        d = r + ' ' + s
        deck.append(d)

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

import itertools
for k in itertools.product(rank, suit):
    print(k)

แต่ถ้าเราต้องการหาผลคูณของ List 2 ตัว ที่เป็นตัวเลข เราจะใช้วิธีนี้แทน

lista = [1,2,3,4]
listb = [2,3,4,5]
print([a*b for a,b in zip(lista,listb)])

Leave a Reply

Your email address will not be published. Required fields are marked *