猿问

使用收益生成器从列表中删除连续的重复项?

我正在尝试使用生成器压缩列表:


例子


[1, 1, 1, 1, 2, 2, 2, 1, 1, 1] == [1, 2, 1]


[5, 5, 5, 4, 5, 6, 6, 5, 5, 7, 8, 0, 0])) == [5, 4, 5, 6, 5, 7, 8, 0]

我尝试使用一个生成器来检查第一个和第二个元素是否相等,然后检查第二个和第三个,依此类推,直到它不再等于“当它达到 4 时”,然后产生“5”,然后它将重复从以下开始的过程“4”


代码

test = [5, 5, 5, 4, 5, 6, 6, 5, 5, 7, 8, 0, 0] # sample list

from typing import Iterable

def compress(items: list) -> Iterable:


    x = 0

    while items[x] == items[x + 1]:

        x += 1

    yield items[x]



ans = compress(test)

for x in ans:

    print(ans)

但我不断得到


生成器对象压缩在 0x00000254D383C820。为什么它不循环?


如果我尝试使用 next() 它只会上升到 5 并且不会检查其他数字。


非常感谢任何帮助。


宝慕林4294392
浏览 126回答 4
4回答

catspeake

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

杨__羊羊

所以有几个缺陷,所有这些缺陷都被描述为对问题帖子的评论。缺少一个会产生多个值的循环你打印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)

喵喵时光机

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

陪伴而非守候

您需要实施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 valfor result in funct(test):    print(result)输出54565780方式二,使用comparison variableO(N) 时间复杂度和 O(1) 空间复杂度def funct(lis):    checker = None    for val in lis:        if checker != val:            checker = val             yield val
随时随地看视频慕课网APP

相关分类

Python
我要回答