*
adalah operator "percikan": Ini mengambil daftar sebagai masukan, dan mengembangkannya menjadi argumen posisi aktual dalam pemanggilan fungsi.
Jadi jika uniqueCrossTabs
dulu [ [ 1, 2 ], [ 3, 4 ] ]
, maka itertools.chain(*uniqueCrossTabs)
sama saja dengan mengatakanitertools.chain([ 1, 2 ], [ 3, 4 ])
Ini jelas berbeda dengan mengoper uniqueCrossTabs
. Dalam kasus Anda, Anda memiliki daftar daftar yang ingin Anda ratakan; apa yang itertools.chain()
dilakukan adalah mengembalikan iterator atas rangkaian semua argumen posisi yang Anda berikan padanya, di mana setiap argumen posisi dapat diulang dengan sendirinya.
Dengan kata lain, Anda ingin meneruskan setiap daftar uniqueCrossTabs
sebagai argumen chain()
, yang akan menyatukannya, tetapi Anda tidak memiliki daftar dalam variabel terpisah, jadi Anda menggunakan*
operator untuk memperluas daftar daftar menjadi beberapa argumen daftar.
Seperti yang ditunjukkan Jochen Ritzel di komentar, chain.from_iterable()
lebih cocok untuk operasi ini, karena mengasumsikan satu iterable untuk memulai. Kode Anda kemudian menjadi:
uniqueCrossTabs = list(itertools.chain.from_iterable(uniqueCrossTabs))