Concatenation ของ String Tuple สองตัว
เมื่อต้องการต่อ (Concatenate) String Tuple สองตัวแบบ Element-wise สามารถใช้ zip() และ Generator Expression ได้
ตัวอย่างโค้ด
my_tuple_1 = ('Jane', 'Pink', 'El')
my_tuple_2 = ('Will', 'Mark', 'Paul')
print("The first tuple is : ")
print(my_tuple_1)
print("The second tuple is : ")
print(my_tuple_2)
# zip จับคู่ แล้วต่อ String (+)
my_result = tuple(elem_1 + elem_2 for elem_1, elem_2 in zip(my_tuple_1, my_tuple_2))
print("The concatenated tuple is : ")
print(my_result)
ผลลัพธ์
The first tuple is : ('Jane', 'Pink', 'El')
The second tuple is : ('Will', 'Mark', 'Paul')
The concatenated tuple is : ('JaneWill', 'PinkMark', 'ElPaul')
คำอธิบาย
- กำหนด Tuple 2 ตัวที่เก็บ String และแสดงผล
- ใช้
zip()จับคู่ Element ที่ Index ตรงกัน - Generator Expression ต่อ String ด้วย
+(elem_1 + elem_2) - แปลงเป็น Tuple ด้วย
tuple() - เก็บผลลัพธ์และแสดง
การทำงานแบบละเอียด
| Index | Tuple 1 | Tuple 2 | Concatenated |
|---|---|---|---|
| 0 | 'Jane' | 'Will' | 'JaneWill' |
| 1 | 'Pink' | 'Mark' | 'PinkMark' |
| 2 | 'El' | 'Paul' | 'ElPaul' |
เพิ่ม Separator ระหว่าง String
# ใส่ Space
result = tuple(elem_1 + ' ' + elem_2 for elem_1, elem_2 in zip(my_tuple_1, my_tuple_2))
print(result) # ('Jane Will', 'Pink Mark', 'El Paul')
# ใส่ Hyphen
result = tuple(elem_1 + '-' + elem_2 for elem_1, elem_2 in zip(my_tuple_1, my_tuple_2))
print(result) # ('Jane-Will', 'Pink-Mark', 'El-Paul')
# ใช้ f-string
result = tuple(f"{a}_{b}" for a, b in zip(my_tuple_1, my_tuple_2))
print(result) # ('Jane_Will', 'Pink_Mark', 'El_Paul')
กรณี Tuple ความยาวไม่เท่ากัน
t1 = ('a', 'b', 'c', 'd')
t2 = ('1', '2')
result = tuple(a + b for a, b in zip(t1, t2))
print(result) # ('a1', 'b2') - zip หยุดที่สั้นกว่า
# ใช้ itertools.zip_longest ถ้าต้องการเติมค่า Default
from itertools import zip_longest
result = tuple((a or '') + (b or '') for a, b in zip_longest(t1, t2, fillvalue=''))
print(result) # ('a1', 'b2', 'c', 'd')
ใช้ Map + Operator (Alternative)
from operator import add
result = tuple(map(add, my_tuple_1, my_tuple_2))
print(result) # ('JaneWill', 'PinkMark', 'ElPaul')