[英]Implementing recursive function with __iter__ method in a Python class
所以我正在解决一个问题,我要创建一个 Python Class 来生成列表的所有排列,我遇到了以下问题:
谢谢!
class permutations():
def __init__(self, ls):
self.list = ls
def __iter__(self):
ls = self.list
length = len(ls)
if length <= 1:
yield ls
else:
for p in self.list_all(ls[1:]):
for x in range(length):
yield p[:x] + ls[0:1] + p[x:]
def list_all(self, ls):
length = len(ls)
if length <= 1:
yield ls
else:
for p in self.list_all(ls[1:]):
for x in range(length):
yield p[:x] + ls[0:1] + p[x:]
只需从__iter__
调用self.list_all
:
class permutations():
def __init__(self, ls):
self.list = ls
def __iter__(self):
for item in self.list_all(self.list):
yield item
def list_all(self, ls):
length = len(ls)
if length <= 1:
yield ls
else:
for p in self.list_all(ls[1:]):
for x in range(length):
yield p[:x] + ls[0:1] + p[x:]
您的list_all
方法已经是一个生成器,因此您可以直接在__iter__
中返回它:
class permutations():
def __init__(self, ls):
self.list = ls
def __iter__(self):
return self.list_all(self.list)
def list_all(self, ls):
length = len(ls)
if length <= 1:
yield ls
else:
for p in self.list_all(ls[1:]):
for x in range(length):
yield p[:x] + ls[0:1] + p[x:]
这既阅读起来更清晰,执行速度也更快。
您还可以选择在__iter__
中定义list_all
。
class permutations2():
def __init__(self, ls):
self.list = ls
def __iter__(self):
def list_all(ls):
length = len(ls)
if length <= 1:
yield ls
else:
for p in list_all(ls[1:]):
for x in range(length):
yield p[:x] + ls[0:1] + p[x:]
return list_all(self.list)
时序permutations
与我的permutations2
给出了几乎相同的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.