Khi cần chuyển đổi tuple lồng nhau (các tuple con) thành ma trận vuông N×N bằng cách đệm (padding) số 0, có thể dùng vòng lặp và toán tử *.
Toán tử * trên tuple lặp lại nội dung tuple nhiều lần.
Ví dụ
# Tuple lồng nhau: các hàng có độ dài khác nhau
matrix_tuple = ((11, 14), (0, 78), (33, 11), (10, 78))
print("Tuple lồng nhau ban đầu:")
for row in matrix_tuple:
print(f" {row} (độ dài: {len(row)})")
N = 4 # Kích thước ma trận vuông mong muốn: 4x4
print(f"\nKích thước ma trận N = {N}")
# Đệm mỗi hàng đến độ dài N bằng số 0
padded_matrix = []
for row in matrix_tuple:
# (0,) * (N - len(row)) tạo tuple số 0 đủ độ dài
padding = (0,) * (N - len(row))
new_row = row + padding
padded_matrix.append(new_row)
print("\nMa trận sau khi đệm 0 (list of tuples):")
for row in padded_matrix:
print(f" {row}")
# Chuyển thành tuple của tuple nếu cần
final_matrix = tuple(padded_matrix)
print(f"\nMa trận cuối cùng (tuple of tuples): {final_matrix}")
Kết quả
Tuple lồng nhau ban đầu: (11, 14) (độ dài: 2) (0, 78) (độ dài: 2) (33, 11) (độ dài: 2) (10, 78) (độ dài: 2) Kích thước ma trận N = 4 Ma trận sau khi đệm 0 (list of tuples): (11, 14, 0, 0) (0, 78, 0, 0) (10, 78, 0, 0) (33, 11, 0, 0) Ma trận cuối cùng (tuple of tuples): ((11, 14, 0, 0), (0, 78, 0, 0), (10, 78, 0, 0), (33, 11, 0, 0))
Giải thích
- Tuple gốc có 4 hàng, mỗi hàng độ dài 2.
- Mục tiêu: ma trận 4x4 (N=4).
- Mỗi hàng cần thêm
N - len(row) = 2số 0. (0,) * 2tạo tuple(0, 0).- Nối
row + paddingtạo hàng mới độ dài 4.
Cách ngắn gọn: List comprehension
N = 4 padded = tuple(row + (0,) * (N - len(row)) for row in matrix_tuple) print(padded)
Xử lý trường hợp hàng dài hơn N (cắt bớt)
def to_square_matrix(tuple_of_tuples, N, pad_value=0):
"""Chuyển thành ma trận NxN: đệm nếu ngắn, cắt nếu dài."""
result = []
for row in tuple_of_tuples:
if len(row) >= N:
result.append(row[:N]) # Cắt bớt
else:
result.append(row + (pad_value,) * (N - len(row))) # Đệm
return tuple(result)
# Test
data = ((1, 2, 3, 4, 5), (6, 7), (8,))
print(to_square_matrix(data, 4))
# ((1, 2, 3, 4), (6, 7, 0, 0), (8, 0, 0, 0))
Sử dụng NumPy (khuyên dùng cho ma trận lớn)
import numpy as np matrix_tuple = ((11, 14), (0, 78), (33, 11), (10, 78)) N = 4 # Chuyển thành array, tự động xử lý padding arr = np.array([list(row) + [0]*(N-len(row)) for row in matrix_tuple]) print(arr) # [[11 14 0 0] # [ 0 78 0 0] # [33 11 0 0] # [10 78 0 0]]