Tôi đã gặp vấn đề tương tự và tìm thấy giải pháp ở đây . Nó hoạt động mà không cần phải nhập bất kỳ mô-đun nào.
Giả sử một danh sách như:
people = ["Lisa","Pam","Phil","John"]
Giải pháp một dòng đơn giản sẽ trông như thế này.
Tất cả các cặp có thể có , bao gồm cả các cặp trùng lặp:
result = [foo(p1, p2) for p1 in people for p2 in people]
Tất cả các cặp có thể có, không bao gồm các cặp trùng lặp :
result = [foo(p1, p2) for p1 in people for p2 in people if p1 != p2]
Các cặp duy nhất , trong đó thứ tự không liên quan:
result = [foo(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
Trong trường hợp bạn không muốn hoạt động mà chỉ để lấy các cặp, loại bỏ chức năng foovà chỉ sử dụng một tuple là đủ.
Tất cả các cặp có thể có , bao gồm cả các cặp trùng lặp:
list_of_pairs = [(p1, p2) for p1 in people for p2 in people]
Kết quả:
('Lisa', 'Lisa')
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Pam')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'Phil')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')
('John', 'John')
Tất cả các cặp có thể có, không bao gồm các cặp trùng lặp :
list_of_pairs = [(p1, p2) for p1 in people for p2 in people if p1 != p2]
Kết quả:
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')
Các cặp duy nhất , trong đó thứ tự không liên quan:
list_of_pairs = [(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
Kết quả:
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'John')
Chỉnh sửa: Sau khi làm lại để đơn giản hóa giải pháp này, tôi nhận ra rằng nó có cùng cách tiếp cận với Adam Rosenfield. Tôi hy vọng lời giải thích lớn hơn sẽ giúp một số người hiểu rõ hơn.