Python 有没有办法生成可能的简短形式?

Python 有没有办法生成可能的简短形式?,python,Python,考虑字符串Building center。如果要求将其缩写以适合特定数量的字符,您和我可以选择非常不同但同样有效的表示形式。例如,三种有效的7个字符表示法是: BLD CNT BLD CTR BLDNGCT 这些数据由以下内容生成: 仅使用字符串中的现有字母(不能使用z缩写) 按照它们出现的顺序使用它们(LBD无效,因为在建筑中L不在B之前) 最多可选择所示数量的字符(包括空格) 我想写一个基于搜索广度或深度的算法,为给定的字符串和所需的长度生成所有这样的简短形式 在开始编写脚本之前,我想知道是

考虑字符串
Building center
。如果要求将其缩写以适合特定数量的字符,您和我可以选择非常不同但同样有效的表示形式。例如,三种有效的7个字符表示法是:

BLD CNT

BLD CTR

BLDNGCT

这些数据由以下内容生成:

  • 仅使用字符串中的现有字母(不能使用z缩写)
  • 按照它们出现的顺序使用它们(
    LBD
    无效,因为在
    建筑中L不在B之前)
  • 最多可选择所示数量的字符(包括空格)
  • 我想写一个基于搜索广度或深度的算法,为给定的字符串和所需的长度生成所有这样的简短形式


    在开始编写脚本之前,我想知道是否已经实现了类似的功能。如果没有,你会建议我怎么写这样的东西?除了
    itertools
    ,还有什么有用的库吗?

    是的,这可以通过
    itertools
    完成:

    import itertools
    
    text = 'Building Centre'
    length = 7
    shorts = [''.join(short) for short in itertools.combinations(text, length)]
    print(shorts)  # 6435 different versions!
    
    请注意,
    itertools.compositions
    确实保留了顺序。你想退房吗

    编辑 如果还允许使用长度小于
    字符的短格式,则可以使用

    shorts = list(itertools.chain(*((''.join(short) for short in itertools.combinations(text, l))
                                    for l in range(1, length + 1))))
    

    如评论中所述,一些简短的表单会生成两次。要解决此问题,请使用例如
    shorts=list(set(shorts))

    这听起来不像是BFS/DFS问题,对我来说,这听起来更像是在itertools中为x查找字符串
    的所有特定长度的(有序)子序列。组合(“Building Center”,7):打印。除了
    itertools
    -为什么从一组可能的答案中省略了
    itertools
    “中心”
    是否是“同等有效的表述”之一?似乎如果你想要合理的缩写,那么你需要添加更多的约束。如果这不是家庭作业,而是你真的想自动生成合理的缩写,这看起来很有希望:“选择尽可能多的字符…”——那么你不应该循环使用
    范围(1+长度)
    ?还有--
    BDE
    (例如)可能会生成两次,但可能不会返回两次。也许先通过
    set()
    运行
    shorts
    。啊!看,我用的是排列而不是组合。非常感谢。