Python 打印字符串的powerset
我试图编写python代码来打印字符串的格式,但遇到了一些bug。以下是我得到的: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]
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