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. 前导 1 后跟 binaryNK(n-1,k-1) 的每个成员

  2. 前导 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...