Khi cần tìm các cặp chuỗi không giao nhau (disjoint) giữa hai danh sách, ta định nghĩa hàm đệ quy dùng lambda, reduce và yield.
Ví dụ
from functools import reduce
def determine_disjoint_pairs(disjoint_data, my_result=[]):
if not disjoint_data and not reduce(lambda a, b: set(a) & set(b), my_result):
yield tuple(my_result)
elif disjoint_data:
yield [idx for k in disjoint_data[0] for idx in determine_disjoint_pairs(disjoint_data[1:], my_result + [k])]
my_list_1 = ["python", "is", "fun"]
my_list_2 = ["its", "awesome", "learning"]
print("Danh sách đầu tiên:")
print(my_list_1)
print("Danh sách thứ hai:")
print(my_list_2)
my_result = list(determine_disjoint_pairs([my_list_1, my_list_2]))
print("Kết quả:")
print(my_result)
Kết quả
Danh sách đầu tiên: ['python', 'is', 'fun']
Danh sách thứ hai: ['its', 'awesome', 'learning']
Kết quả: [('fun', 'its'), ('fun', 'awesome')]
Giải thích
Hàm
determine_disjoint_pairsđệ quy tạo các cặp từ hai danh sách.Dùng
reducevới lambda kiểm tra giao của các tập hợp (set) trong my_result.Nếu không có dữ liệu và không giao nhau, yield tuple kết quả.
Ngược lại, duyệt phần tử đầu tiên của disjoint_data, gọi đệ quy với phần còn lại.
Kết quả là các cặp chuỗi không có ký tự chung.