如何使用 previous/current/next 从列表中获取唯一值?
How to get unique values from list using previous/current/next?
我实现了一个程序,它接受一个列表,returns 基于前一个、当前和下一个元素的唯一值。
但是,当列表的开头有两个以上的相同元素时,该程序将无法运行。
例如:[0, 0, 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, 0, 1, 2]
for u in test(l):
print(u)
如果 next_item
为 None
,则循环终止。如果 previous_item
不等于 current_item
,我只会生成 previous_item
。如果 previous_item
不等于 current_item
,我也只移动 previous_item
“指针”。 previous_item
总是保证有一个值,所以我很困惑为什么像 [0, 0, 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
我实现了一个程序,它接受一个列表,returns 基于前一个、当前和下一个元素的唯一值。
但是,当列表的开头有两个以上的相同元素时,该程序将无法运行。
例如:[0, 0, 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, 0, 1, 2]
for u in test(l):
print(u)
如果 next_item
为 None
,则循环终止。如果 previous_item
不等于 current_item
,我只会生成 previous_item
。如果 previous_item
不等于 current_item
,我也只移动 previous_item
“指针”。 previous_item
总是保证有一个值,所以我很困惑为什么像 [0, 0, 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