Tôi gặp sự cố tương tự và tìm thấy giải pháp here. 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"]
Một 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ể, bao gồm bản sao:
result = [foo(p1, p2) for p1 in people for p2 in people]
Tất cả các cặp có thể, trừ bản sao:
result = [foo(p1, p2) for p1 in people for p2 in people if p1 != p2]
cặp Unique, nơi trật tự là không thích hợp:
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 nhưng chỉ để nhận các cặp, hãy xóa hàm foo
và chỉ sử dụng một bộ túp là đủ.
Tất cả các cặp có thể, bao gồm bản sao:
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ể, trừ bản sao:
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ặp Unique, nơi trật tự là không thích hợp:
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')
Edit: Sau khi làm lại để đơn giản hóa giải pháp này, tôi nhận ra nó là như nhau cách tiếp cận hơn 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 nó tốt hơn.
Không biết về itertools, điều này là hoàn hảo. Cảm ơn ! – GuiSim
Odd, khi tôi chạy itertools.product (my_list, 2), nó phàn nàn rằng int không thể gọi được. Hoạt động khi tôi thay đổi nó thành: itertools.product (my_list, repeat = 2) – ojrac
(sử dụng Python 2.6.2) – ojrac