3
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 次,则如果在飞行时加入字符串,则脸颊,并且仅打印字符串。

问题不在于我尝试做什么,或者打印全部并忽略 if ... 或打印 notting。怎么做对,或者也许在 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 )

更清楚地解释 qustion - 在给下一个函数之前过滤所有字符超过 x 重复的字符串。例如 - 有简单的 print that strings ,而不是 print strings 什么不是规则。

4

2 回答 2

4

如果我理解正确,您希望打印每个字符最多只能找到 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

... 
于 2020-10-13T12:24:12.317 回答
1

一种更具建设性的方法(意思是:我不迭代所有可能的组合 - 我直接构建有效组合)。

你需要sympy安装它才能工作。

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

我首先通过有限的重复获得所有的partitions,而不是由多个部分组成。我立即将它们转换为列表:Mk=MAX - 1m=N

{3: 2} [3, 3, 0, 0, 0, 0]
{3: 1, 2: 1, 1: 1} [3, 2, 1, 0, 0, 0]
{3: 1, 1: 3} [3, 1, 1, 1, 0, 0]
{2: 3} [2, 2, 2, 0, 0, 0]
{2: 2, 1: 2} [2, 2, 1, 1, 0, 0]
{2: 1, 1: 4} [2, 1, 1, 1, 1, 0]
{1: 6} [1, 1, 1, 1, 1, 1]

在这些列表中,我迭代了多集排列 - 我的意思是那些代表我选择的元素以及它们重复的频率:例如:

[2, 1, 2, 0, 0, 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

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

于 2020-10-13T15:07:26.110 回答