Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Cộng hai tuple trong Python

Khi cần cộng phần tử tương ứng của hai tuple (element-wise addition), có thể dùng map() kết hợp hàm lambda hoặc zip() với list comprehension.

Hàm map() áp dụng hàm cho từng cặp phần tử từ nhiều iterable.

Hàm lambda định nghĩa hàm vô danh ngắn gọn.

Ví dụ

tuple_1 = (11, 14, 54, 56, 87)
tuple_2 = (98, 0, 10, 13, 76)

print(f"Tuple 1: {tuple_1}")
print(f"Tuple 2: {tuple_2}")

# Cách 1: map + lambda
result = tuple(map(lambda a, b: a + b, tuple_1, tuple_2))
print(f"\nCách 1 - map+lambda: {result}")

# Cách 2: zip + list comprehension (Pythonic hơn)
result2 = tuple(a + b for a, b in zip(tuple_1, tuple_2))
print(f"Cách 2 - zip+comprehension: {result2}")

# Cách 3: numpy (hiệu quả cho tuple lớn)
import numpy as np
result3 = tuple(np.array(tuple_1) + np.array(tuple_2))
print(f"Cách 3 - numpy: {result3}")

Kết quả

Tuple 1: (11, 14, 54, 56, 87)
Tuple 2: (98, 0, 10, 13, 76)

Cách 1 - map+lambda: (109, 14, 64, 69, 163)
Cách 2 - zip+comprehension: (109, 14, 64, 69, 163)
Cách 3 - numpy: (109, 14, 64, 69, 163)

Giải thích

  • zip(tuple_1, tuple_2) ghép cặp phần tử cùng vị trí: (11,98), (14,0), (54,10)....
  • map(lambda a,b: a+b, ...) áp dụng phép cộng cho mỗi cặp.
  • tuple() chuyển kết quả về tuple.
  • zip dừng ở iterable ngắn hơn (an toàn nếu độ dài khác nhau).

Các phép toán element-wise khác

# Trừ
sub = tuple(a - b for a, b in zip(tuple_1, tuple_2))
# Nhân
mul = tuple(a * b for a, b in zip(tuple_1, tuple_2))
# Chia (cẩn thận chia cho 0)
div = tuple(a / b if b != 0 else float('inf') for a, b in zip(tuple_1, tuple_2))
# Lũy thừa
pow_ = tuple(a ** b for a, b in zip(tuple_1, tuple_2))

Hàm chung cho mọi phép toán

import operator

def elementwise_op(t1, t2, op):
    """Áp dụng phép toán op cho từng cặp phần tử."""
    return tuple(map(op, t1, t2))

# Sử dụng
print(elementwise_op(tuple_1, tuple_2, operator.add))      # Cộng
print(elementwise_op(tuple_1, tuple_2, operator.sub))      # Trừ
print(elementwise_op(tuple_1, tuple_2, operator.mul))      # Nhân
print(elementwise_op(tuple_1, tuple_2, operator.truediv))  # Chia
print(elementwise_op(tuple_1, tuple_2, operator.pow))      # Lũy thừa

Xử lý tuple độ dài khác nhau

from itertools import zip_longest

# zip_longest điền fillvalue cho iterable ngắn hơn
t1 = (1, 2, 3)
t2 = (10, 20)
result = tuple(a + b for a, b in zip_longest(t1, t2, fillvalue=0))
print(result)  # (11, 22, 3)