gpt4 book ai didi

python - 如何将 python 列表的所有子集放入 n 个容器中

转载 作者:行者123 更新时间:2023-11-28 21:51:22 25 4
gpt4 key购买 nike

我有一个列表:

a = range(2)

我正在尝试以所有可能的方式将列表的内容放入 n(=3) 个容器中,给出(顺序不重要):

[[[],[0],[1]],
[[],[1],[0]],
[[],[0,1],[]],
[[],[],[0,1]],
[[0],[1],[]],
[[0],[],[1]],
[[1],[0],[]],
[[1],[],[0]],
[[0,1],[],[]]]

到目前为止,我一直在使用 sympy.utilities.iterables 库,首先获取所有可能的子集并过滤 variations 方法的输出以获得所需的结果:

def binner(a,n=3):
import numpy as np
import sympy.utilities.iterables as itt
import itertools as it
b = list(itt.subsets(a)) #get all subsets
b.append(()) #append empty tuple to allow two empty bins
c=list(itt.variations(b,n))
d=[]
for x in c:
if np.sum(np.bincount(list(it.chain.from_iterable(x))))==len(a):
d.append(x) # add only combinations with no repeats and with all included
return list(set(d)) # remove duplicates

我觉得有更好的方法可以做到这一点。谁能帮忙?

请注意,我不受限于 sympy 库,并且对任何基于 python/numpy 的替代方案持开放态度。

最佳答案

假设我理解您的目标(不确定在重复元素的情况下您可能希望发生什么,即您是否要将它们视为不同的),您可以使用 itertools.product:

import itertools

def everywhere(seq, width):
for locs in itertools.product(range(width), repeat=len(seq)):
output = [[] for _ in range(width)]
for elem, loc in zip(seq, locs):
output[loc].append(elem)
yield output

给出

>>> for x in everywhere(list(range(2)), 3):
... print(x)
...
[[0, 1], [], []]
[[0], [1], []]
[[0], [], [1]]
[[1], [0], []]
[[], [0, 1], []]
[[], [0], [1]]
[[1], [], [0]]
[[], [1], [0]]
[[], [], [0, 1]]

关于python - 如何将 python 列表的所有子集放入 n 个容器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30455638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com