4 回答

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]

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)

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"

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
添加回答
舉報(bào)