Để xử lý dữ liệu trùng lặp trong danh sách hoặc danh sách chứa từ điển, Python cung cấp nhiều cách tiếp cận linh hoạt và hiệu quả.
Loại bỏ trùng lặp trong danh sách đơn giản
1. Duyệt danh sách bằng vòng lặp for
items = ['x', 'y', 5, 7, 7, 'x']
unique_items = []
for item in items:
if item not in unique_items:
unique_items.append(item)
print(unique_items) # Kết quả: ['x', 'y', 5, 7]
2. Sử dụng list comprehension kết hợp điều kiện
items = ['x', 'y', 5, 7, 7, 'x']
result = []
[result.append(i) for i in items if i not in result]
print(result) # Kết quả: ['x', 'y', 5, 7]
3. Chuyển đổi sang set rồi quay lại list
items = ['x', 'y', 5, 7, 7, 'x']
deduplicated = list(set(items))
print(deduplicated) # Kết quả: [5, 7, 'y', 'x'] — thứ tự có thể thay đổi
Để giữ nguyên thứ tự ban đầu sau khi dùng set(), có thể áp dụng:
# Cách 1: Dùng sort với key
items = ['x', 'y', 5, 7, 7, 'x']
deduplicated = list(set(items))
deduplicated.sort(key=items.index)
print(deduplicated) # Kết quả: ['x', 'y', 5, 7]
# Cách 2: Dùng sorted
items = ['x', 'y', 5, 7, 7, 'x']
deduplicated = sorted(set(items), key=items.index)
print(deduplicated) # Kết quả: ['x', 'y', 5, 7]
4. Sử dụng từ điển để bảo toàn thứ tự
items = ['x', 'y', 5, 7, 7, 'x']
temp_dict = dict.fromkeys(items)
unique_list = list(temp_dict.keys())
print(unique_list) # Kết quả: ['x', 'y', 5, 7]
5. Loại bỏ hoàn toàn các phần tử bị trùng (không giữ lại bản sao nào)
items = ['x', 'y', 5, 7, 7, 'x']
non_repeating = [i for i in items if items.count(i) == 1]
print(non_repeating) # Kết quả: ['y', 5]
Xử lý trùng lặp trong danh sách chứa từ điển
Phương pháp 1: Sử dụng reduce và lambda
from functools import reduce
def remove_duplicate_dicts():
data = [{"id": "A", "val": "100"}, {"id": "A", "val": "100"}, {"val": "100", "id": "A"}]
merge = lambda acc, curr: acc if curr in acc else acc + [curr]
return reduce(merge, [[]] + data)
print(remove_duplicate_dicts()) # [{'id': 'A', 'val': '100'}]
Phương pháp 2: Dùng set theo cặp key-value
data = [{"name": "Lan", "age": "20"}, {"name": "Hồng", "age": "20"}, {"name": "Lan", "age": "20"}]
def deduplicate_dict_list(input_list):
seen = set()
output = []
for d in input_list:
hashable = tuple(sorted(d.items()))
if hashable not in seen:
seen.add(hashable)
output.append(d)
return output
print(deduplicate_dict_list(data)) # Giữ lại duy nhất mỗi cấu trúc
Phương pháp 3: Sử dụng list comprehension và set
data = [{"name": "Lan", "age": "20"}, {"name": "Hồng", "age": "20"}, {"name": "Lan", "age": "20"}]
cleaned = [dict(t) for t in {tuple(sorted(d.items())) for d in data}]
print(cleaned) # Chuyển dict → tuple → set → dict