[英]Accessing next index (+1) using enumerate() in Python
第一次在这里发帖,所以任何协议/风格的事情请告诉我。 我对编程只有大约 2 个月的时间,所以仍在弄清楚绳索。
我正在尝试获取一个字符串(例如'AAAABBBCCDAABBB')并仅返回字符的离散出现,同时保留原始顺序。 如果一个字母在另一个新字母被引入后重复,那没关系。 所以成功的返回应该是 ['A', 'B', 'C', 'D', 'A', 'B']。
经过许多不同的方式,我正在尝试使用 enumerate() 例如:
#If j doesn't match the j with an index of + 1, assign it to the list.
def unique_in_order(iterable):
output= []
for i, j in enumerate(iterable):
if j != j[i + 1]: #Pretty sure the issue is in this line
output.append(j)
return output
我不是 100% 访问 j 的索引 + 1 的语法。 我也在这里得到一个字符串索引超出范围错误,我假设是当迭代到达最后一个 j 时,这意味着下一个索引离开悬崖边缘并返回错误。 我一直无法找到/生成一个好的解决方案。 我猜有 len(j) 的东西,但很短。
谢谢!
您可以将所有内容都包装在 try-catch 块中。 如果引发IndexError
异常,我们知道我们一定已经结束了
def unique_in_order(iterable):
output = []
for index, element in enumerate(iterable):
try:
if element != iterable[index+1]:
output.append(element)
except IndexError:
output.append(element)
break
return output
print(unique_in_order("AABCCCDDDDDEE"))
输出:
['A', 'B', 'C', 'D', 'E']
>>>
或者,就像评论建议的那样,只需使用itertools.groupby
:
def unique_in_order(iterable):
from itertools import groupby
return [key for key, _ in groupby(iterable)]
print(unique_in_order("AABCCCDDDDDEE"))
输出:
['A', 'B', 'C', 'D', 'E']
>>>
您可以检查输出中的最后一项是否与当前值不同
def unique_in_order(iterable):
output= []
for j in iterable:
# add to list if output empty
# or current value not equal to last value
# in output
if not output or j != output[-1]:
output.append(j)
return output
print(unique_in_order('AAAABBBCCDAABBB')) # ['A', 'B', 'C', 'D', 'A', 'B']
或纠正张贴的方法
而不是这个
if j != j[i + 1]:
你可能是说
if i < len(iterable) -1 and j != iterable[i + 1]:
但是,这仍然是不正确的。 它不会在结束组“...ABBB”中选择最后一个 B
更好的
def unique_in_order(iterable):
output= []
for i, j in enumerate(iterable):
# On first index or
# Adds first element of group
# so even if group starts on last item in string
# it still gets added
if i == 0 or j != iterable[i-1]:
output.append(j)
return output
print(unique_in_order('AAAABBBCCDAABBB')) # ['A', 'B', 'C', 'D', 'A', 'B']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.