如何解决结合替换和最大出现限制
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 举报,一经查实,本站将立刻删除。