ผมมีปัญหาที่คล้ายกันและพบว่าการแก้ปัญหาที่นี่ ใช้งานได้โดยไม่ต้องนำเข้าโมดูลใด ๆ
สมมติว่ารายการเช่น:
people = ["Lisa","Pam","Phil","John"]
โซลูชันบรรทัดเดียวที่เรียบง่ายจะมีลักษณะเช่นนี้
คู่ที่เป็นไปได้ทั้งหมดรวมถึงรายการที่ซ้ำกัน:
result = [foo(p1, p2) for p1 in people for p2 in people]
คู่ที่เป็นไปได้ทั้งหมดไม่รวมรายการที่ซ้ำกัน :
result = [foo(p1, p2) for p1 in people for p2 in people if p1 != p2]
คู่ที่ไม่ซ้ำกันโดยที่คำสั่งไม่เกี่ยวข้อง:
result = [foo(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
ในกรณีที่คุณไม่ต้องการใช้งาน แต่เพียงเพื่อให้ได้คู่การลบฟังก์ชันfooและใช้เพียงทูเปิลก็เพียงพอแล้ว
คู่ที่เป็นไปได้ทั้งหมดรวมถึงรายการที่ซ้ำกัน:
list_of_pairs = [(p1, p2) for p1 in people for p2 in people]
ผลลัพธ์:
('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')
คู่ที่เป็นไปได้ทั้งหมดไม่รวมรายการที่ซ้ำกัน :
list_of_pairs = [(p1, p2) for p1 in people for p2 in people if p1 != p2]
ผลลัพธ์:
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')
คู่ที่ไม่ซ้ำกันโดยที่คำสั่งไม่เกี่ยวข้อง:
list_of_pairs = [(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
ผลลัพธ์:
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'John')
แก้ไข: หลังจากการทำซ้ำเพื่อลดความซับซ้อนของโซลูชันนี้ฉันรู้ว่ามันเป็นแนวทางเดียวกันกับ Adam Rosenfield ฉันหวังว่าคำอธิบายที่กว้างขึ้นจะช่วยให้บางคนเข้าใจได้ดีขึ้น