问题描述
我实现了一个程序,该程序接受一个列表,并根据上一个,当前和下一个元素返回唯一值。
但是,当列表开头有两个以上相同元素时,该程序将无法运行。
例如:[0,1]
这是代码,其后是对机制的描述。
def test(current):
iterator = iter(current)
prevIoUs_item = next(iterator)
current_item = next(iterator)
next_item = True
while next_item:
try:
next_item = next(iterator)
except stopiteration:
next_item = None
if prevIoUs_item == current_item:
current_item = next_item
else:
yield prevIoUs_item
prevIoUs_item = current_item
current_item = next_item
if prevIoUs_item:
yield prevIoUs_item
if __name__ == "__main__":
l = [0,1,2]
for u in test(l):
print(u)
如果next_item
为None
,则循环终止。如果prevIoUs_item
不等于prevIoUs_item
,我只会产生current_item
。如果prevIoUs_item
不等于prevIoUs_item
,我也只移动current_item
“指针”。 prevIoUs_item
总是保证有一个值,所以我很困惑为什么[0,1]
之类的输入什么都不产生。
此致
解决方法
您的while循环正在测试next_item
是否为not null,表示不等于0
,None
,[]
,{}
等...因此,一旦值取0,循环就会停止。
相反,您可以这样做:
def test(current):
iterator = iter(current)
previous_item = next(iterator)
current_item = next(iterator)
next_item = 0
while next_item is not None:
try:
next_item = next(iterator)
except StopIteration:
next_item = None
if previous_item == current_item:
current_item = next_item
else:
yield previous_item
previous_item = current_item
current_item = next_item
if previous_item:
yield previous_item