4 回答

TA贡献1111条经验 获得超0个赞
正如其他人所解释的那样,您的结构不正确 - 您只会在循环外遇到一次 yield 。理想的方法是迭代成对的连续数字,如果它们不同,则产生循环中的第一个数字。
itertools.groupby
但是,这是一种删除连续重复项的规范方法:
from itertools import groupby
from operator import itemgetter
list(map(itemgetter(0), groupby(l)))
# [1, 2, 1]

TA贡献1943条经验 获得超7个赞
所以有几个缺陷,所有这些缺陷都被描述为对问题帖子的评论。
缺少一个会产生多个值的循环
你打印ans而不是x,这在逻辑上是生成器对象。
这段代码对你有用吗?
test = [5, 5, 5, 4, 5, 6, 6, 5, 5, 7, 8, 0, 0]
def compress(items):
for i, d in enumerate(items[:-1]):
if d == items[i+1]:
continue
yield d
yield items[-1]
for x in compress(test):
print(x)

TA贡献1846条经验 获得超7个赞
如果您正在寻找与此相同的效果,请查看该itertools.groupby功能。使用内置工具更明智。
如果你对学习生成器感兴趣,那就写吧。除了在错误的级别上出现“yield”之外,您没有犯任何错误,但是您编写了非 Pythonic 代码。跟踪 x 和 x+1 并将整个内容保存在内存中都是不好的。
class NeverInList: pass
from typing import Iterable
def compress(items: list) -> Iterable:
previous = NeverInList() # Something never in a list, duh.
for item in items:
if item != previous:
yield item
previous = item
ans = compress(test)
for x in ans:
print(x) # "x", not "ans"

TA贡献1757条经验 获得超8个赞
您需要实施stack,并查看列表的最后一个元素是否与值相同
test = [5, 5, 5, 4, 5, 6, 6, 5, 5, 7, 8, 0, 0]
def funct(lis):
l = []
for val in lis:
if len(l) ==0:
l.append(val)
yield val
if l[-1] != val:
l.append(val)
yield val
for result in funct(test):
print(result)
输出
5
4
5
6
5
7
8
0
方式二,使用comparison variableO(N) 时间复杂度和 O(1) 空间复杂度
def funct(lis):
checker = None
for val in lis:
if checker != val:
checker = val
yield val
添加回答
举报