有没有方法可以在Python中取消列表的列出?

5 投票
2 回答
11976 浏览
提问于 2025-04-17 09:47

我想找一种方法,可以直接访问列表中的元素。比如,下面是获取四个集合的笛卡尔积的正常方式。

>>> list(itertools.product((0,1), (0,1),(0,1),(0,1)))
[(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 1, 0), (0, 0, 1, 1), (0, 1, 0, 0), (0, 1, 0, 1), (0, 1, 1, 0), (0, 1, 1, 1), (1, 0, 0, 0), (1, 0, 0, 1), (1, 0, 1, 0), (1, 0, 1, 1), (1, 1, 0, 0), (1, 1, 0, 1), (1, 1, 1, 0), (1, 1, 1, 1)]

但是在这种情况下,这四个集合是一样的,反复输入同样的内容很快就会让人感到无聊和疲惫,这让人想到可以这样做:

>>> list(itertools.product([(0,1)]*4)

但当然这样是行不通的,因为itertools.product函数会把它当作一个集合,而不是四个集合。所以,问题是,有没有办法做到这一点:

>>> list(itertools.product(delist([(0,1)]*4))

2 个回答

5

如果你没有使用 itertools.product,你也可以用 * 这个符号。* 符号的作用就是把一个列表或其他可迭代的对象里的内容变成函数需要的参数。简单来说,就是把里面的东西“拆开”来用。

args = ['arg1', 'arg2', 'arg3', 'arg4']

# The following two calls are exactly equivalent
func('arg1', 'arg2', 'arg3', 'arg4')
func(*args)

在这个具体的例子中,代码看起来是这样的:

itertools.product(*[(0,1)]*4)

不过,之前的回答(KennyTM 提供的)在使用 itertools.product 的情况下可能会更简洁一些:

itertools.product((0, 1), repeat=4)
10
itertools.product((0,1), repeat=4)

product 函数可以接受一个可选的 repeat 参数。上面的写法其实和 itertools.product((0, 1), (0, 1), (0, 1), (0, 1)) 是一样的。


一般来说,如果你有一个列表

lst = [1, 2, 4, 6, 8, ...]

并且你想像这样调用一个函数

f(1, 2, 4, 6, 8, ...)

你可以使用 星号 *(展开)运算符,把列表展开成函数的参数列表:

f(*lst)

撰写回答