Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 打印字符串的powerset_Python_Powerset - Fatal编程技术网

Python 打印字符串的powerset

Python 打印字符串的powerset,python,powerset,Python,Powerset,我试图编写python代码来打印字符串的格式,但遇到了一些bug。以下是我得到的: def getperm (string): perm = [] if len(string) == 0: perm.append("") return perm #if len(string) == 1: # perm.append(string) # perm.append("") first = string[0]

我试图编写python代码来打印字符串的格式,但遇到了一些bug。以下是我得到的:

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的细微差别,还是我的代码中有bug?我想我的代码应该没问题——我要开始第五版的破解代码面试了

谢谢大家!

这就是你想要的吗

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"))
这是你想要的吗

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"))

有一种排列方法:

>>> 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')]

有一种排列方法:

>>> 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')]

您是否尝试过跟踪您的算法的实际功能

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中?如果是,伪代码是什么?

您是否尝试过跟踪算法的实际功能

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中?如果是这样,伪代码是什么?

你想得太多了

这一部分做得太多了

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
现在,通过一点重构,您应该能够使代码看起来更漂亮

您想得太多了

这一部分做得太多了

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
现在,您应该能够通过一些重构使代码看起来更漂亮了

使用:

powerset
是一个方便的功能,可直接从
itertools

使用:


powerset
是直接从
itertools

实现的一个方便功能,这里有一个重构迭代解决方案,不带
itertools
模块:

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

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

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


您希望生成的是幂集,而不是置换。字符串
'ab'
的唯一排列是
'ab'
'ba'
。另外,你真的不应该给字符串命名
string
(这是一个内置模块的名称),我也不确定你在已经是字符串的对象上调用
str
,想要实现什么(
first
rem
,等等)。@Matt Ball是的——很好的决定。尽管如此,我没有生成“ab”或“ba”。你知道为什么吗?@abarnert非常正确——我将字符串重命名为其他名称,并删除了多余的str()但是我仍然收到错误。知道为什么吗?很明显,这些并没有引起你的问题;它们只是让你更难阅读……同时,你应该用编辑过的代码更新问题。你要生成的是幂集,而不是排列。字符串
'ab'
的唯一排列是
'ab'
'ba'
。此外,你真的不应该给字符串命名
字符串
(这是内置模块的名称),我不确定你在已经是字符串的对象上调用
str
想要实现什么(比如
first
rem
).@Matt Ball是的——打得好。即使如此,我也不会生成“ab”或“ba”。你知道为什么吗?@abarnert非常正确——我将字符串重命名为其他名称,并删除了多余的str()但是我仍然收到错误。知道为什么吗?很明显,这些问题并没有引起你的问题;它们只是让你更难阅读…同时,你应该用编辑过的代码更新问题。我相信这样可以,但我正在寻找使用递归实现解决方案。谢谢!我正在搜索组合看到这一点,转到docs.
将_与_replacement()结合起来
——实际上有一个方法!:'))有没有一种方法可以不用使用软件包itertools就可以做到这一点?我相信可以做到,但我希望使用递归实现解决方案。非常感谢。正在寻找替换的组合。看到这个,去看医生<代码>将_与_replacement()组合起来(——实际上是其中的一个方法!:'))有没有一种方法可以不使用itertools软件包就完成您的工作?就是这样!非常感谢。extend做了什么我的代码没有做的事情?@mythander889,
.extend
只是将上一级的结果加载到当前结果中。我尝试运行此代码,它不打印幂,它只打印字符串的所有字母。@nakulchawla09,我不确定你所说的“幂”是什么意思,但是它可能不同于powersetI,我很抱歉输入错误,我指的是powerset。对于这个程序,我不知怎么地得到了输出
[,“a”,“b”]
,我在考虑得到这样的输出
[,“a”,“b”,“ab”,“ba”]
!非常感谢。extend做了什么我的代码没有做的事情?@mythander889,
.extend
只是将上一级的结果加载到当前结果中。我尝试运行此代码,它不打印幂,它只打印字符串的所有字母。@nakulchawla09,我不确定你所说的“幂”是什么意思,但是它可能不同于powersetI,我很抱歉输入错误,我指的是powerset。对于这个程序,我不知何故得到了输出
[“”,“a”,“b”]
,我是t