【发布时间】:2019-10-22 14:17:25
【问题描述】:
我正在编写一个程序来生成字符串的所有排列:
def print_permutations_wrapper(str):
strList = str.split()
print_permutations(strList, 0, len(strList))
def print_permutations(strList: list, start: int, end: int):
if start >= end - 1:
print(strList)
return
print_permutations(strList, start+1, end)
for i in range(start+1, end):
strList[start], strList[i] = strList[i], strList[start]
print_permutations(strList, start+1, end)
strList[i], strList[start] = strList[start], strList[i]
def main():
str = 'a b c'
print_permutations_wrapper(str)
if __name__ == "__main__":
main()
它工作正常,但不是打印它,我想使用yield懒惰地返回它:
def print_permutations_wrapper(str):
strList = str.split()
yield from print_permutations(strList, 0, len(strList))
def print_permutations(strList: list, start: int, end: int):
if start >= end - 1:
yield strList
return
yield from print_permutations(strList, start+1, end)
for i in range(start+1, end):
strList[start], strList[i] = strList[i], strList[start]
yield from print_permutations(strList, start+1, end)
strList[i], strList[start] = strList[start], strList[i]
def main():
str = 'a b c'
x = print_permutations_wrapper(str)
print(list(x))
if __name__ == "__main__":
main()
我得到的输出是:
[['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]
而不是所有的排列。
如何纠正这个?
我正在使用 Python 3.7。
【问题讨论】:
-
您正在变异相同的
strList,因此结果将是相同列表的列表。您可以尝试在print_permutations中使用yield list(strList)来创建该列表的浅表副本,或者使用内置的itertools.permutations,文档包括示例实现。另见相关“Least Astonishment” and the Mutable Default Argument。 -
@metatoaster
yield list(strList)生成该列表的深层副本,而不是浅层副本。 -
哦,它现在可以工作了.. 谢谢!您可能想将其写在答案中。有趣的链接。对于初学者来说绝对是惊人的!
-
@AlbinPaul
list不会递归地复制可能是从参数接收到的引用列表中的任何内部引用。它只涉及顶级元素 - 您需要deepcopy来获得您的建议。
标签: python iterator generator permutation yield