*
คือโอเปอเรเตอร์ "splat": ใช้รายการเป็นอินพุตและขยายเป็นอาร์กิวเมนต์ตำแหน่งจริงในการเรียกใช้ฟังก์ชัน
ถ้าuniqueCrossTabs
เป็น[ [ 1, 2 ], [ 3, 4 ] ]
เช่นนั้นitertools.chain(*uniqueCrossTabs)
ก็เหมือนกับที่พูดitertools.chain([ 1, 2 ], [ 3, 4 ])
uniqueCrossTabs
นี้จะเห็นได้ชัดที่แตกต่างจากที่ผ่านในเวลาเพียง ในกรณีของคุณคุณมีรายการที่คุณต้องการจะแบน อะไรitertools.chain()
ส่งคืนตัววนซ้ำในการต่อกันของอาร์กิวเมนต์ตำแหน่งทั้งหมดที่คุณส่งผ่านไปยังอาร์กิวเมนต์ตำแหน่งแต่ละอาร์กิวเมนต์สามารถทำซ้ำได้ในสิทธิของตัวเอง
กล่าวอีกนัยหนึ่งคือคุณต้องการส่งผ่านแต่ละรายการuniqueCrossTabs
เป็นอาร์กิวเมนต์chain()
ซึ่งจะรวมเข้าด้วยกัน แต่คุณไม่มีรายการในตัวแปรแยกต่างหากดังนั้นคุณจึงใช้*
โอเปอเรเตอร์เพื่อขยายรายการของรายการเป็นอาร์กิวเมนต์หลายรายการ
ดังที่ Jochen Ritzel ได้ชี้ให้เห็นในความคิดเห็นchain.from_iterable()
นั้นเหมาะสมกว่าสำหรับการดำเนินการนี้เนื่องจากถือว่าการทำซ้ำเพียงครั้งเดียวเริ่มต้นด้วย จากนั้นรหัสของคุณจะกลายเป็น:
uniqueCrossTabs = list(itertools.chain.from_iterable(uniqueCrossTabs))