第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用收益生成器從列表中刪除連續(xù)的重復(fù)項(xiàng)?

使用收益生成器從列表中刪除連續(xù)的重復(fù)項(xiàng)?

寶慕林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]我嘗試使用一個生成器來檢查第一個和第二個元素是否相等,然后檢查第二個和第三個,依此類推,直到它不再等于“當(dāng)它達(dá)到 4 時”,然后產(chǎn)生“5”,然后它將重復(fù)從以下開始的過程“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。為什么它不循環(huán)?如果我嘗試使用 next() 它只會上升到 5 并且不會檢查其他數(shù)字。非常感謝任何幫助。
查看完整描述

4 回答

?
catspeake

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個贊

正如其他人所解釋的那樣,您的結(jié)構(gòu)不正確 - 您只會在循環(huán)外遇到一次 yield 。理想的方法是迭代成對的連續(xù)數(shù)字,如果它們不同,則產(chǎn)生循環(huán)中的第一個數(shù)字。

itertools.groupby但是,這是一種刪除連續(xù)重復(fù)項(xiàng)的規(guī)范方法:

from itertools import groupby 

from operator import itemgetter


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

# [1, 2, 1]


查看完整回答
反對 回復(fù) 2022-12-14
?
楊__羊羊

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個贊

所以有幾個缺陷,所有這些缺陷都被描述為對問題帖子的評論。


缺少一個會產(chǎn)生多個值的循環(huán)

你打印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)


查看完整回答
反對 回復(fù) 2022-12-14
?
喵喵時光機(jī)

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個贊

如果您正在尋找與此相同的效果,請查看該itertools.groupby功能。使用內(nèi)置工具更明智。


如果你對學(xué)習(xí)生成器感興趣,那就寫吧。除了在錯誤的級別上出現(xiàn)“yield”之外,您沒有犯任何錯誤,但是您編寫了非 Pythonic 代碼。跟蹤 x 和 x+1 并將整個內(nèi)容保存在內(nèi)存中都是不好的。


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"


查看完整回答
反對 回復(fù) 2022-12-14
?
陪伴而非守候

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個贊

您需要實(shí)施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) 時間復(fù)雜度和 O(1) 空間復(fù)雜度


def funct(lis):

    checker = None

    for val in lis:

        if checker != val:

            checker = val 

            yield val


查看完整回答
反對 回復(fù) 2022-12-14
  • 4 回答
  • 0 關(guān)注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號