【问题标题】:print powerset of a string打印字符串的幂集
【发布时间】:2012-09-28 01:31:45
【问题描述】:

我正在尝试编写 python 代码来打印字符串的powerset,但遇到了一些错误。这是我得到的:

def getperm (string):
    perm = []
    if len(string) == 0:
        perm.append("")
        return perm
    #if len(string) == 1:
    #   perm.append(string)
    #   perm.append("")
    first = string[0]
    print "first = " + str(first)
    rem = string[1:len(string)]
    print "rem = " + str(rem)
    words = getperm(rem)
    for word in words:
        for i in range(len(word)):
            temp = string[0:i] + first + string[i:len(string)]
            print "temp = " + str(temp)
            perm.append(temp)

    return perm

if __name__=="__main__":
    a = "ab"
    mag  = getperm(a)
    print mag

我的预期输出是:

['', 'a', 'b', 'ab']

我的实际输出是:

[]

谁能帮我弄清楚发生了什么?这是python的一些细微差别,还是我的代码中有错误?我认为我的代码应该没问题——我要离开第五版的破解编码面试

谢谢!

【问题讨论】:

  • 您正在寻找生成幂集,而不是排列。字符串'ab' 的唯一排列是'ab''ba'
  • 另外,你真的不应该将字符串命名为string(这是内置模块的名称),我不确定你通过调用@987654329 想要完成什么@ 在已经是字符串的对象上(firstrem 等)。
  • @Matt Ball 是的——好电话。即便如此,我不会生成“ab”或“ba”。你知道为什么吗?
  • @abarnert 非常正确——我将字符串重命名为不同的名称,并删除了多余的 str() 但仍然收到错误消息。知道为什么吗?
  • 好吧,显然这些并没有导致您的问题;他们只是让阅读变得更难......同时,您应该使用代码的编辑版本更新问题。

标签: python powerset


【解决方案1】:

这是一个重构的迭代解决方案没有 itertools 模块:

def powerset(s):
    a = ['']
    for i,c in enumerate(s):
        for k in range(2**i):
            a.append(a[k]+c)
    return a

【讨论】:

    【解决方案2】:

    你想多了

    这部分做得太多了

    for word in words:
        for i in range(len(word)):
            temp = string[0:i] + first + string[i:len(string)]
            print "temp = " + str(temp)
            perm.append(temp)
    

    看看它应该多么简单

    def get_powerset (string):
        perm = []
        if len(string) == 0:
            perm.append("")
            return perm
        #if len(string) == 1:
        #   perm.append(string)
        #   perm.append("")
        first = string[0]
        print "first = " + str(first)
        rem = string[1:len(string)]
        print "rem = " + str(rem)
        words = get_powerset(rem)
        perm.extend(words)
        for word in words:
            perm.append(first+word)
    
        return perm
    
    if __name__=="__main__":
        a = "ab"
        mag  = get_powerset(a)
        print mag
    

    现在您应该能够通过一些重构使代码看起来更漂亮

    【讨论】:

    • 做到了!谢谢你。我的代码没有做哪些扩展?
    • @mythander889, .extend 只是将上一级的结果加载到当前结果中。
    • 我尝试运行这段代码,它不打印幂,它只是打印字符串的所有字母。
    • @nakulchawla09,我不确定你所说的“权力”是什么意思,但它可能与权力集不同
    • 我很抱歉打字错误,我的意思只是电源设置。对于这个程序,我以某种方式获得了输出 [" ", "a", "b"] ,我正在考虑获得像 [" ", "a", "b", "ab", "ba"] 这样的输出的条款
    【解决方案3】:

    这是你想要的吗?

    import itertools as it
    
    def func(s):
        for i in range(len(s)+1):
            for combo in it.combinations(s,i):
                yield "".join(combo)
    
    print list(func("abc"))
    

    【讨论】:

    • 我相信可以做到,但我希望使用递归来实现解决方案。谢谢!
    • 正在搜索替换组合。看到这个,去了文档..combinations_with_replacement()——实际上是一个方法! :')
    • 有没有办法在不使用包 itertools 的情况下做你所做的事情?
    【解决方案4】:

    有一种排列方法:

    >>> import itertools
    >>> chars = "ABCD"
    >>> perms = list(itertools.permutations(chars))
    >>> print(perms)
    [('A', 'B', 'C'),
     ('A', 'C', 'B'),
     ('B', 'A', 'C'),
     ('B', 'C', 'A'),
     ('C', 'A', 'B'),
     ('C', 'B', 'A')]
    

    【讨论】:

      【解决方案5】:

      您是否尝试过跟踪您的算法的实际作用?

      getperm('ab'):
        first, rem = 'a', 'b'
        words = getperm('b')
          first, rem = 'b', ''
          words = getperm('')
          words = ['']
          for word in words:
            for i in range(len(word)):
              pass # only called on '', so doesn't matter
          return []
        words = []
        for word in words:
          pass # only called on [], so doesn't matter
      

      所以,这里没有 Python 的细微差别;您的算法在 O(N) 步中返回空列表,并且您已在 Python 中正确编码了该算法。

      (当然,您可以添加一些更有用的打印语句,而不是手动跟踪它,并查看每个步骤实际上在做什么。)

      这可能不是您想要的算法,但您需要告诉我们您试图做什么。例如,您是否将一些伪代码从 Hoare 移植到 Python 中?如果有,伪代码是什么?

      【讨论】:

        【解决方案6】:

        使用来自more_itertoolspowerset

        >>> import more_itertools
        
        >>> ["".join(p) for p in list(more_itertools.powerset("ab"))]
        ['', 'a', 'b', 'ab']
        

        这个powerset是直接从itertoolsrecipes实现的便利函数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多