有没有一种方法可以在Python中删除列表?

5

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

>>> 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))

也许你应该考虑创建一些类或者一对类来封装这些数据的细节,并将你想要执行的操作以对象方法的形式暴露出来。 - Jim Dennis
2个回答

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)

所以他只需要添加 ,即 list(itertools.product([(0,1)]*4)),虽然使用 repeat 更好。 - Rusty Rob
这很尴尬,我应该先看文档。话虽如此,您的答案中有一个小错误,应该是itertools.product((0,1), repeat=4),尽管如此,仍然是个有用的回答。谢谢。 - qed

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)

然而,在 itertools.product 这个特定情况下,前面的答案(由 KennyTM 给出)可能更加简洁。
itertools.product((0, 1), repeat=4)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接