Khi cần xóa các hàng (row) trong ma trận tuple (tuple của các tuple) mà tất cả phần tử trong hàng đó giống nhau, có thể dùng list comprehension kết hợp với hàm all().
Hàm all() trả về True nếu tất cả phần tử trong iterable là True (hoặc iterable rỗng).
Ma trận tuple là tuple lồng nhau: mỗi hàng là một tuple.
Ví dụ
# Ma trận tuple (tuple của tuple)
matrix = ((11, 14, 0), (78, 33, 11), (10, 78, 0), (78, 78, 78))
print("Ma trận ban đầu:")
for row in matrix:
print(f" {row}")
# Lọc bỏ hàng mà TẤT CẢ phần tử đều bằng phần tử đầu tiên của hàng đó
# all(sub == row[0] for sub in row) -> True nếu mọi phần tử = row[0]
filtered = tuple(row for row in matrix if not all(elem == row[0] for elem in row))
print("\nMa trận sau khi xóa hàng đồng nhất:")
for row in filtered:
print(f" {row}")
Kết quả
Ma trận ban đầu: (11, 14, 0) (78, 33, 11) (10, 78, 0) (78, 78, 78) Ma trận sau khi xóa hàng đồng nhất: (11, 14, 0) (78, 33, 11) (10, 78, 0)
Giải thích
- Hàng
(78, 78, 78)có tất cả phần tử = 78 -> bị loại bỏ. all(elem == row[0] for elem in row)kiểm tra mọi phần tử trong hàng có bằng phần tử đầu không.not all(...)ngược lại: giữ hàng nếu không phải tất cả phần tử giống nhau.- List comprehension lọc và
tuple()chuyển kết quả về tuple.
Biến thể: Xóa hàng có ít nhất N phần tử giống nhau
from collections import Counter
def remove_rows_with_repeats(matrix, min_repeats=3):
"""Xóa hàng có phần tử lặp lại ít nhất min_repeats lần."""
result = []
for row in matrix:
counts = Counter(row)
max_count = max(counts.values())
if max_count < min_repeats:
result.append(row)
return tuple(result)
matrix = ((1, 1, 2), (3, 3, 3), (4, 5, 4), (6, 6, 6))
print(remove_rows_with_repeats(matrix, 3)) # ((1, 1, 2), (4, 5, 4))
print(remove_rows_with_repeats(matrix, 2)) # ((4, 5, 4),)
Xóa hàng trùng lặp hoàn toàn (duplicate rows)
def remove_duplicate_rows(matrix):
seen = set()
result = []
for row in matrix:
if row not in seen:
seen.add(row)
result.append(row)
return tuple(result)
matrix = ((1, 2), (3, 4), (1, 2), (5, 6))
print(remove_duplicate_rows(matrix)) # ((1, 2), (3, 4), (5, 6))