mylist="'a','b','c'"
count=0
i=0
while count< len(mylist):
if mylist[i]==mylist[i+1]:
print mylist[i]
count +=1
i +=1
Run Code Online (Sandbox Code Playgroud)
错误:
File "<string>", line 6, in <module>
IndexError: string index out of range
Run Code Online (Sandbox Code Playgroud)
我假设当它到达最后一个(第n个)元素时,它找不到n + 1来比较它,所以它给了我一个错误.
有趣的是,我认为我之前已经完成了这个并且没有在更大的列表中出现这个问题:这是一个例子(由Raymond Hettinger负责修复它)
list=['a','a','x','c','e','e','f','f','f']
i=0
count = 0
while count < len(list)-2:
if list[i] == list[i+1]:
if list [i+1] != list [i+2]:
print list[i]
i+=1
count +=1
else:
print "no"
count += 1
else:
i +=1
count += 1
Run Code Online (Sandbox Code Playgroud)
为了按照我尝试的方式浏览列表,是否有任何修复以便我不会"超出范围?" 我计划在一个非常大的列表上实现它,例如,我必须检查"list [i] == list [i + 16]".在将来,我想添加条件,如"if int(mylist [i + 3]) - int(mylist [i + 7])> 10:newerlist.append [mylist [i]".所以我解决这个问题很重要.
我想插入一个break语句,但没有成功.
我知道这不是最有效的,但我正处于我最了解的地步.
所以听起来你正试图在各种固定偏移量下比较列表中的元素.也许这样的事情可以帮助你:
for old, new in zip(lst, lst[n:]):
if some_cond(old, new):
do_work()
Run Code Online (Sandbox Code Playgroud)
lst[n:] 返回lst的副本,从第n个(注意0索引)元素开始
>>> lst = [1,2,2,3];
>>> lst[1:]
[2,2,3]
Run Code Online (Sandbox Code Playgroud)
zip(l1, l2) 创建一个新的元组列表,每个列表中包含一个元素
>>> zip(lst, lst[1:])
[(1, 2), (2, 2), (2, 3)]
Run Code Online (Sandbox Code Playgroud)
请注意,只要列表用完,它就会停止.在这种情况下,偏移列表首先用完.
对于元组列表,你可以在循环变量中直接"upack",所以
for old, new in zip(lst, lst[1:])
Run Code Online (Sandbox Code Playgroud)
给出你想要的元素循环(列表中的连续元素对)