结合替换和最大出现限制

如何解决结合替换和最大出现限制

from itertools import *
import collections
for i in combinations_with_replacement(['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'],15):
    b = (''.join(i))
    freq = collections.Counter(b)
    for k in freq:
        if freq [k] < 5:
            print(k)

代码最多打印字符,如果少于5则计数

我该怎么做,如果在该字符串的任何位置重复有不超过x个字符的字符,请从飞行时的字符串中抽出,然后打印该字符串。

问题不是我尝试做的事情,或者它全部打印,并忽略...或打印提示。 怎么样,或者在python存在简单的解决方案?

结果最多比5个例子

False - fffaaffbbdd ( repeat 5 titemes f)
False - fffffaaaaac ( repeat 5 times a and f)
True -  aaabbbccc11 ( no any character repeated more than 4 times )

更清晰的解释问题-在给下一个函数之前,过滤所有字符多于x个重复的字符串。 作为序言-有一个简单的打印字符串,而不打印不规则的字符串。

解决方法

如果我理解正确,您想打印每个字符最多只能找到4次的字符串:

from collections import Counter
from itertools import combinations_with_replacement


for i in combinations_with_replacement(['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'],15):
    c = Counter(i)
    if c.most_common(1)[0][1] > 4:
        continue
    print(''.join(i))

打印:

...

00002446899cccd
00002446899ccce
00002446899cccf
00002446899ccdd

... 
,

一种更具建设性的方法(意味着:我不会遍历所有可能的组合-我会直接构建有效的组合)。

您需要安装sympy才能起作用。

在示例中,我仅使用元素"abcdef"并将重复限制为严格小于MAX = 4。我将要输出的字符串的长度固定在M = 6

我首先获得M的所有partitions,它们的重复次数受限制k=MAX - 1,并且组成不超过m=N个部分。我立即将它们转换为列表:

{3: 2} [3,3,0]
{3: 1,2: 1,1: 1} [3,2,1,1: 3} [3,0]
{2: 3} [2,0]
{2: 2,1: 2} [2,0]
{2: 1,1: 4} [2,0]
{1: 6} [1,1]
这些列表中的

我遍历了多集排列-我的意思是表示那些我选择的元素以及它们重复的频率:例如:

[2,1] -> "aabccf"  # 2*"a",1*"b",...,0*"e",1*"f"

那么您想要的结果就是这些字符串的多集置换。

from sympy.utilities.iterables import multiset_permutations,partitions

MAX = 4  # (all counts < MAX)
elements = "abcdef"
N = len(elements)
M = 6  # output length


def dict_to_list(dct,N):
    ret = [0] * N
    j = 0
    for k,v in dct.items():
        ret[j:j + v] = [k] * v
        j += v
    return ret


for dct in partitions(M,k=MAX - 1,m=N):
    lst = dict_to_list(dct,N)
    for part in multiset_permutations(lst):
        el = ''.join(n * v for n,v in zip(part,elements))
        for msp in multiset_permutations(el):
            print(''.join(msp))

对于您的情况,您需要进行以下更改:

MAX = 5  # (all counts < MAX)
elements = "0123456789abcdef"
M = 15  # output length

但是它的复杂性是巨大的(但是比原始方法之一要好得多!)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?