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