函数调用中的星号[重复]
- 2025-01-15 08:45:00
- admin 原创
- 132
问题描述:
我正在使用 itertools.chain 以这种方式“展平”列表列表:
uniqueCrossTabs = list(itertools.chain(*uniqueCrossTabs))
这与以下说法有何不同:
uniqueCrossTabs = list(itertools.chain(uniqueCrossTabs))
解决方案 1:
*
是“splat”运算符:它以列表之类的可迭代对象作为输入,并将其扩展为函数调用中的实际位置参数。
所以如果uniqueCrossTabs
是[[1, 2], [3, 4]]
,那么itertools.chain(*uniqueCrossTabs)
就等于说itertools.chain([1, 2], [3, 4])
这显然与仅传入不同uniqueCrossTabs
。 在您的例子中,您有一个要展平的列表列表;它itertools.chain()
所做的是返回一个迭代器,迭代器会连接您传递给它的所有位置参数,其中每个位置参数本身都是可迭代的。
换句话说,您想将每个列表uniqueCrossTabs
作为参数传递给chain()
,以便将它们链接在一起,但是您没有将列表放在单独的变量中,因此您使用*
运算符将列表列表扩展为几个列表参数。
chain.from_iterable()
更适合此操作,因为它假设一开始就有一个可迭代对象。然后您的代码将变得简单:
uniqueCrossTabs = list(itertools.chain.from_iterable(uniqueCrossTabs))
解决方案 2:
它将序列分成函数调用的单独参数。
>>> 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)
解决方案 3:
这只是解释概念/使用它的另一种方式。
import random
def arbitrary():
return [x for x in range(1, random.randint(3,10))]
a, b, *rest = arbitrary()
# a = 1
# b = 2
# rest = [3,4,5]
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD