- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么我的 yield
关键字没有产生预期的输出?
我正在使用递归算法(合并排序)并使用 yield
以便每次更改(排序)时我都可以遍历列表。
def MergeSort(lst):
if len(lst) > 1:
middle = len(lst)//2
lefthalf = lst[:middle]
righthalf = lst[middle:]
MergeSort(lefthalf)
MergeSort(righthalf)
i,j,k= 0,0,0
while i<len(lefthalf) and j<len(righthalf):
if lefthalf[i] < righthalf[j]:
lst[k] = lefthalf[i]
i+=1
else:
lst[k] = righthalf[j]
j+=1
k+=1
while i<len(lefthalf):
lst[k]=lefthalf[i]
i+=1
k+=1
while j<len(righthalf):
lst[k]=righthalf[j]
j+=1
k+=1
yield lst
a = MergeSort([2,3,566,78,8])
for i in a:
print(i)
[2, 3, 566, 78, 8]
相反,我希望实现如下目标:(随着算法的运行)
[2, 3, 566, 78, 8]
[2, 3, 566, 8, 78]
[2, 3, 8, 78, 566]
如果我使用 return
语句,它将正常工作并按预期对列表进行排序,但是当我使用 yield
时,我无法获得合适的生成器。我还尝试将 yield
放在 while
语句和几乎所有其他地方。我怎样才能解决这个问题?我错过了什么?
最佳答案
因为您使 MergeSort
成为生成器,而生成器是惰性的,所以您的递归调用实际上不会进行任何排序;他们只是返回生成器,在您遍历它们之前不会做任何工作。你的整个函数也只产生一个列表,因为它只包含一个 yield
语句,而且它不在循环中所以它只执行一次。
解决这两个问题的方法是使用 yield from MergeSort(...)
来耗尽您递归创建的生成器。这将使它们耗尽,以便它们进行排序工作,并且还会导致外部生成器产生内部生成器产生的结果。因此,更改这两行:
yield from MergeSort(lefthalf)
yield from MergeSort(righthalf)
例子:
>>> for i in MergeSort([2, 3, 566, 78, 8]):
... print(i)
...
[2, 3]
[8, 78]
[8, 78, 566]
[2, 3, 8, 78, 566]
请注意,您没有看到相同长度的列表;递归调用在较短的列表中,因此它们会产生较短的列表。您也没有在基本情况下看到长度为 1 的列表,因为您的 yield lst
语句位于 if len(lst) > 1:
block 内。如果您取消该行的缩进以便 yield lst
是无条件的,您可以看到每次调用的结果:
>>> for i in MergeSort([2, 3, 566, 78, 8]):
... print(i)
...
[2]
[3]
[2, 3]
[566]
[78]
[8]
[8, 78]
[8, 78, 566]
[2, 3, 8, 78, 566]
关于python - 为什么 "yield"关键字没有在我的应用程序中生成预期的生成器? (归并排序算法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59443376/
本文实例汇总了Java各种排序算法。分享给大家供大家参考,具体如下: 1. 冒泡排序: ?
1.冒泡排序 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 算法步
前言 平时用惯了高级语言高级工具高级算法,难免对一些基础算法感到生疏。但最基础的排序算法中实则蕴含着相当丰富的优化思维,熟练运用可起到举一反三之功效。 选择排序 选择排序几乎是
我是一名优秀的程序员,十分优秀!