3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊
*
是“splat”運(yùn)算符:它將列表作為輸入,并將其擴(kuò)展為函數(shù)調(diào)用中的實(shí)際位置參數(shù)。
如果uniqueCrossTabs
是的話[ [ 1, 2 ], [ 3, 4 ] ]
,那itertools.chain(*uniqueCrossTabs)
就像說的一樣itertools.chain([ 1, 2 ], [ 3, 4 ])
這明顯不同于傳入uniqueCrossTabs
。在您的情況下,您有一個(gè)您希望展平的列表列表; 什么itertools.chain()
是在你傳遞給它的所有位置參數(shù)的串聯(lián)上返回一個(gè)迭代器,其中每個(gè)位置參數(shù)本身是可迭代的。
換句話說,您希望將每個(gè)列表uniqueCrossTabs
作為參數(shù)傳遞給chain()
它們,它們將它們鏈接在一起,但是您沒有單獨(dú)變量中的列表,因此您使用*
運(yùn)算符將列表列表擴(kuò)展為多個(gè)列表參數(shù)。
正如Jochen Ritzel在評論中指出的那樣,chain.from_iterable()
它更適合于這種操作,因?yàn)樗俣梢缘淮蔚?。您的代碼變得簡單:
uniqueCrossTabs = list(itertools.chain.from_iterable(uniqueCrossTabs))

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
它將序列拆分為函數(shù)調(diào)用的單獨(dú)參數(shù)。
>>> def foo(a, b=None, c=None):
... print a, b, c
...
>>> foo([1, 2, 3])
[1, 2, 3] None None
>>> foo(*[1, 2, 3])
1 2 3
>>> def bar(*a):
... print a
...
>>> bar([1, 2, 3])
([1, 2, 3],)
>>> bar(*[1, 2, 3])
(1, 2, 3)
添加回答
舉報(bào)