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
错误:
File "<string>", line 6, in <module>
IndexError: string index out of range
我假设当到达最后一个(nth)元素时,找不到与之比较的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
对于按照我尝试的方式爬取列表,是否有任何修复方法可以防止我“超出范围”?我计划在一个很大的列表上实现此功能,例如,我必须在其中检查“ list [i] == list [i + 16]”。将来,我想添加诸如“ if int(mylist [i + 3])-int(mylist [i + 7])> 10:newerlist.append [mylist [i]””之类的条件。因此,解决这个问题很重要。
我曾考虑插入break语句,但未成功。
我知道这不是最有效的方法,但是我现在正是我最了解的地方。
最佳答案
编辑:
正确,有了OP中的新信息,这变得简单得多。使用the itertools
grouper()
recipe将每个人的数据分组为元组:
import itertools
def grouper(iterable, n, fillvalue=None):
"""Collect data into fixed-length chunks or blocks"""
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return itertools.zip_longest(*args, fillvalue=fillvalue)
data = ['John', 'Sally', '5', '10', '11', '4', 'John', 'Sally', '3', '7', '7', '10', 'Bill', 'Hallie', '4', '6', '2', '1']
grouper(data, 6)
现在,您的数据如下所示:
[
('John', 'Sally', '5', '10', '11', '4'),
('John', 'Sally', '3', '7', '7', '10'),
('Bill', 'Hallie', '4', '6', '2', '1')
]
相比之下,哪种方法应该易于使用。
旧答案:
如果您需要进行更多的任意链接,而不仅仅是检查连续值:
def offset_iter(iterable, n):
offset = iter(iterable)
consume(offset, n)
return offset
data = ['a', 'a', 'x', 'c', 'e', 'e', 'f', 'f', 'f']
offset_3 = offset_iter(data, 3)
for item, plus_3 in zip(data, offset_3): #Naturally, itertools.izip() in 2.x
print(item, plus_3) #if memory usage is important.
自然,您将要使用语义上有效的名称。这种方法的优点是它可以与任意迭代器一起使用,而不仅限于列表,并且高效且易读,而无需按索引进行任何丑陋,低效的迭代。如果偏移值用完(例如,对于其他条件),如果您需要继续检查,请使用
itertools.zip_longest()
(2.x中的itertools.izip_longest()
)。使用the
consume()
recipe from itertools
。import itertools
import collections
def consume(iterator, n):
"""Advance the iterator n-steps ahead. If n is none, consume entirely."""
# Use functions that consume iterators at C speed.
if n is None:
# feed the entire iterator into a zero-length deque
collections.deque(iterator, maxlen=0)
else:
# advance to the empty slice starting at position n
next(itertools.islice(iterator, n, n), None)
但是,在这种情况下,我将非常质疑您是否需要重新检查数据结构。
原始答案:
我不确定您的目标是什么,但是根据我的收集,您可能想要
itertools.groupby()
:>>> import itertools
>>> data = ['a', 'a', 'x', 'c', 'e', 'e', 'f', 'f', 'f']
>>> grouped = itertools.groupby(data)
>>> [(key, len(list(items))) for key, items in grouped]
[('a', 2), ('x', 1), ('c', 1), ('e', 2), ('f', 3)]
当有(任意大)重复项目运行时,可以使用此方法进行计算。值得注意的是,您可以为
itertools.groupby()
提供一个key
参数,该参数将根据您想要的任何因素(不仅仅是平等)对它们进行分组。