如何解决运行此Python代码时遇到“ MemoryError”
我了解我的代码可能包含很多冗余,但是我在优化它方面确实很努力。
from itertools import permutations
n = 2
new = ['(',')'] * n
paren = list(permutations(new,(n*2)))
def matched(str):
count = 0
for i in str:
if i == "(":
count += 1
elif i == ")":
count -= 1
if count < 0:
return False
return count == 0
z = []
for d in paren:
true = ''.join(d)
if matched(true) == True:
z.append(d)
f2 = set(z)
r = []
for i in f2:
stru = ''.join(i)
r.append(stru)
print(r)
我对该程序的目标是提供所有可能的n对平衡括号。最终结果应为包含带括号的各种字符串的列表:n = 2 ['()()','(())']。不幸的是,该代码仅在n
文件“ real.py”,第4行,在 paren = list(permutations(new,(n * 2))) MemoryError
提前谢谢!
解决方法
您可以为此使用递归生成器:
def parens(s,max_len,n_open):
if len(s) + n_open == max_len:
yield s + n_open*')'
elif n_open == 0:
yield from parens(s + '(',n_open + 1)
else:
yield from parens(s + '(',n_open + 1)
yield from parens(s + ')',n_open - 1)
然后您可以像这样遍历结果:
n = 3
for s in parens('(',max_len=2*n,n_open=1):
print(s)
n=3
的示例输出:
((()))
(()())
(())()
()(())
()()()
,
让我们使用小的paren
诊断n
的内容:
# As before...
from itertools import permutations
n = 2
new = ['(',')'] * n
paren = list(permutations(new,(n*2)))
def display(elements):
for item in elements:
print(''.join(item))
display(sorted(paren))
您会发现很多重复。
但是itertools.combinations
也不直接起作用-由于考虑顺序的原因,所有元素只有一个唯一的组合。
我们有多个相同的元素,我们希望它们的顺序很重要,但不要在相同的元素之间。
实际上,技巧是选择(
所在的位置(并将)
s放在其他位置)。为此,我们可以简单地将range(n*2)
用于职位候选人,并从其中combinations
中选择n
。然后,只需构建相应的字符串即可。
(也许您可以想到一种直接检查(
位置的给定组合是否对应于匹配的有效字符串的方法。提示:两个相邻(
位置之间的区别是什么?关于)
的问题吗?)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。