python—下10个项目开始重复的项目索引

python—下10个项目开始重复的项目索引,python,python-2.7,Python,Python 2.7,我正在用蒙特卡罗方法做一些简单的建模。基本上我想找到值收敛的点。我的数据结构是一个列表l。为了简单起见 l = range(10) + [1] * 10 所以l[10:10+10]=[1,1,1,1,1,1,1,1,1] 如何自动找到索引(在本例中为10),其中列表中的下10项开始重复相同的值(即值的收敛点) 提前感谢您的帮助 >>> L = range(10) + [1]*10 >>> for i in range(len(L)-10+1): ...

我正在用蒙特卡罗方法做一些简单的建模。基本上我想找到值收敛的点。我的数据结构是一个列表l。为了简单起见

l = range(10) + [1] * 10
所以
l[10:10+10]=[1,1,1,1,1,1,1,1,1]

如何自动找到索引(在本例中为10),其中列表中的下10项开始重复相同的值(即值的收敛点)

提前感谢您的帮助

>>> L = range(10) + [1]*10
>>> for i in range(len(L)-10+1):
...     if len(set(L[i:i+10])) == 1:
...         print i
... 
10
还有一个itertools配方

import itertools
L = range(10) + [1]*10
comp = itertools.groupby(L)
i = 0
for _k,run in comp:
    run = list(run)
    if len(run) == 10:
        print i
    i += len(run)
还有一个itertools配方

import itertools
L = range(10) + [1]*10
comp = itertools.groupby(L)
i = 0
for _k,run in comp:
    run = list(run)
    if len(run) == 10:
        print i
    i += len(run)
这里使用动态规划为每个查询提供一个O(n)算法。根据您的程序如何更新此列表以及它将保存哪些值,可能会有一个O(logn)更新/查询算法来代替此算法,例如,Fenwick树

l = range(10) + [1]*10
dp, ans = [1 for i in l], []
for i in range(1, len(l)):
    if l[i] == l[i - 1]:
        dp[i] = dp[i - 1] + 1
    if dp[i] >= 10:
        ans.append(i - 9)
这里使用动态规划为每个查询提供一个O(n)算法。根据您的程序如何更新此列表以及它将保存哪些值,可能会有一个O(logn)更新/查询算法来代替此算法,例如,Fenwick树

l = range(10) + [1]*10
dp, ans = [1 for i in l], []
for i in range(1, len(l)):
    if l[i] == l[i - 1]:
        dp[i] = dp[i - 1] + 1
    if dp[i] >= 10:
        ans.append(i - 9)

在iterables上工作的人:

def find_convergence(iterable, count):
    current_count = 0
    last = None

    for i, x in enumerate(iterable):
        if x == last:
            current_count += 1

            if current_count == count:
                return i - count + 1
        else:
            last = x
            current_count = 1

这可能有点冗长,但它是关于iterable和常量空间长度的线性时间。

一个适用于iterable的时间:

def find_convergence(iterable, count):
    current_count = 0
    last = None

    for i, x in enumerate(iterable):
        if x == last:
            current_count += 1

            if current_count == count:
                return i - count + 1
        else:
            last = x
            current_count = 1

这可能有点冗长,但它是可数和常量空间长度上的线性时间。

啊,
groupby
真聪明!我想您可能需要根据以前的计数调整
I
。@minitech:
previous counts
?是否将
I
作为组的索引,而不是原始列表中组的开始?是的。OP想要索引,所以我不得不用Enumerate跟踪它。哦,groupby真的很不错。我不必以这种方式限制特定的数字。谢谢啊,那群人真聪明!我想您可能需要根据以前的计数调整
I
。@minitech:
previous counts
?是否将
I
作为组的索引,而不是原始列表中组的开始?是的。OP想要索引,所以我不得不用Enumerate跟踪它。哦,groupby真的很不错。我不必以这种方式限制特定的数字。谢谢我不知道。这正是我想要的,我非常感激。但我没有足够的分数来投票。非常抱歉,我不知道。这正是我想要的,我非常感激。但我没有足够的分数来投票。我很抱歉。