Xác định các chỉ số cột (index) mà trong đó có phần tử trùng lặp (xuất hiện ở hàng trước đó), sau đó loại bỏ các cột đó khỏi tất cả các hàng. Sử dụng itertools.chain và generator.
Ví dụ
Minh họa:
from itertools import chain
def remove_dupes(my_sub):
my_string = set()
for i, elem in enumerate(my_sub):
if elem not in my_string:
my_string.add(elem)
else:
yield i
my_list = [[5, 1, 6, 7, 9], [6, 3, 1, 9, 1], [4, 2, 9, 8, 9], [5, 1, 6, 7, 3]]
print("Ma trận:", my_list)
K = 3
temp_idxs = set(chain.from_iterable(remove_dupes(sub) for sub in my_list))
my_result = [[elem for i, elem in enumerate(sub) if i not in temp_idxs] for sub in my_list]
print("Kết quả:", my_result)
Kết quả
Ma trận: [[5, 1, 6, 7, 9], [6, 3, 1, 9, 1], [4, 2, 9, 8, 9], [5, 1, 6, 7, 3]] Kết quả: [[5, 1, 6, 7], [6, 3, 1, 9], [4, 2, 9, 8], [5, 1, 6, 7]]
Giải thích
- Hàm
remove_dupesduyệt qua một hàng (sub), dùng set theo dõi phần tử đã thấy. Nếu phần tử đã có trong set -> yield index (cột trùng lặp). chain.from_iterablegom tất cả index trùng lặp từ tất cả hàng thành một settemp_idxs.- Tạo ma trận mới: chỉ giữ phần tử ở index KHÔNG nằm trong
temp_idxs.