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参数,该参数将根据您想要的任何因素(不仅仅是平等)对它们进行分组。

10-07 16:19
查看更多