为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

宝慕林4294392 2022-12-14 21:09:20
我正在尝试使用生成器压缩列表:例子[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 listfrom typing import Iterabledef 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 并且不会检查其他数字。非常感谢任何帮助。
查看完整描述

4 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

正如其他人所解释的那样,您的结构不正确 - 您只会在循环外遇到一次 yield 。理想的方法是迭代成对的连续数字,如果它们不同,则产生循环中的第一个数字。

itertools.groupby但是,这是一种删除连续重复项的规范方法:

from itertools import groupby 

from operator import itemgetter


list(map(itemgetter(0), groupby(l)))

# [1, 2, 1]


查看完整回答
反对 回复 2022-12-14
?
杨__羊羊

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)


查看完整回答
反对 回复 2022-12-14
?
喵喵时光机

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"


查看完整回答
反对 回复 2022-12-14
?
陪伴而非守候

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


查看完整回答
反对 回复 2022-12-14
  • 4 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号