如何解决2个重复元素的所有组合
我想知道我可以在确定长度列表中获得的 0 和 1 的所有组合,并定义 0 元素和 1 元素的数量。
示例:
Length: 4
Number of 0: 2
Number of 1: 2 (this information is length - number of zeroes)
我想获得以下列表:
combination = [[0,1,1],[0,0],[1,0]]
我尝试过迭代.product,但我无法定义 0 和 1 的数量。
我做了一个过滤器,根据列表的总和对所有组合进行分组(如果总和为 2,我有我的样本的所有组合)。但是,我需要知道长度为 106 个元素(0 和 1)的所有组合,而笔记本电脑无法工作。
解决方法
假设您的问题是:“列出相同数量的所有组合 给定数量的零的零和一”。
我们使用“product”来迭代所有可能的双倍长度序列 零的数量,过滤掉所有出现的零和 不相等(所以 sum(list) 必须等于零的数量)。
打印列表的长度。
重复打印实际列表。
这对于大量零来说效果不佳。
import itertools
num_zeroes = 2
base_tuple = (0,1) # * num_zeroes
perms = itertools.product(base_tuple,repeat=2 * num_zeroes)
p2 = itertools.filterfalse(lambda x: sum(x) != num_zeroes,perms)
print(len(list(p2)))
# 6
perms = itertools.product(base_tuple,perms)
print(list(p2))
# [(0,1,1),(0,0),# (1,(1,0)]
,
对于生成长度为 n
的所有二进制字符串的问题,实际上有一个非常好的递归解决方案,其中设置了精确的 k
位。当然有 n!/(n!k!)
这样的字符串。
假设我们有一个返回所需集合的函数 binaryNK(n,k)
。关键的观察是这个集合可以划分为两个子集:
-
前导 1 后跟
binaryNK(n-1,k-1)
的每个成员 -
前导 0 后跟
binaryNK(n-1,k)
的每个成员
当然,1只在k > 0
时有效,2只在n > k
时有效。终止条件是 n == 0
,此时我们有一个解决方案。
这里有一些简单的代码来说明:
def binaryNK(s,n,k):
if n == 0: print(s)
if k > 0: binaryNK(s+"1",n-1,k-1)
if n > k: binaryNK(s+"0",k)
binaryNK("",5,2)
输出:
11000
10100
10010
10001
01100
01010
01001
00110
00101
00011
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。