繁体   English   中英

浏览列表并检入Python

[英]Going through a list and checking in Python

我目前正在寻找一种算法,以便能够浏览如下列表: [1,1,1,1,2,3,4,5,5,5,3,2]我想要的是在此示例中,为了能够选择第一个“ 1”,因为它旁边有一个重复项,并不断浏览列表,直到找到下一个具有重复项的下一个数字,然后选择该数字的最后一个数字(即在此示例中为“ 5”)。 最终,使这两个数字之间的差(即5-1)

我现在有这段代码:

i=0    

for i in range(len(X)):

    if (X[i] == X[i+1]):
        first_number = X[i]

    elif (X[i] != X[i+1]):
        i+=1

我想为我的问题再加上一个条件。 假设您具有以下列表:lst = [1,1,1,1,2,3,4,5,5,5,3,3,3,3,3,2,2,2,4,3,3]情况下,我将根据您的代码= lst = [4,-2,-1]得到以下差异,然后停止。 但是,我希望以后将“ 4-2”添加到列表中,因为“ 4”后跟一个小于“ 4”的数字(因此,“ 2”后面跟着相反的方向-向上-以下是4“)。 我希望这足够清楚。 非常感谢

您可以使用起始索引为1 enumerate 如果当前值等于上一个索引的值,则检测到重复项:

l = [1,1,1,1,2,3,4,5,5,5,3,2]
r = [v for i, v in enumerate(l, 1) if i < len(l) and v == l[i]]

result = r[-1] - r[0]
# 4

列表r是所有重复项的列表。 r[-1]是最后一项, r[0]是第一项。

更多试用:

>>> l= [1,1,5,5,5,2,2]
>>> r = [v for i, v in enumerate(l, 1) if i < len(l) and v == l[i]]
>>> r[-1] - r[0]
1

解:

def subDupeLimits( aList ):
    dupList = []
    prevX = None
    for x in aList:
        if x == prevX:
            dupList.append(x) # track duplicates
        prevX = x # update previous x

    # return last duplicate minus first
    return dupList[-1] - dupList[0]

# call it
y = subDupeLimits( [1,1,1,1,2,3,4,5,5,5,3,2] )
# y =  4

您可以使用itertools.groupby查找重复数字的组,然后查找前两个数字之间的差异:

>>> import itertools
>>> lst = [1,1,1,1,2,3,4,5,5,5,3,2]
>>> duplicates = [k for k, g in itertools.groupby(lst) if len(list(g)) > 1] 
>>> duplicates[1] - duplicates[0]
4

或使用duplicates[-1] - duplicates[0]如果您想要第一个和最后一个重复数字之间的差值。

在更一般的情况下,如果您希望所有连续重复的数字对之间都存在差异,可以将其与zip结合使用:

>>> lst = [1,1,1,1,2,3,4,5,5,5,3,3,3,3,2,2,2]
>>> duplicates = [k for k, g in itertools.groupby(lst) if len(list(g)) > 1] 
>>> duplicates
[1, 5, 3, 2]
>>> [x - y for x,y in zip(duplicates, duplicates[1:])]
[-4, 2, 1]

我想现在我得到了您想要的东西:您想要列表中任何连续的“高原”之间的差异,其中高原是重复值或局部最小值或最大值。 这有点复杂,将采取以下步骤:

>>> lst=[1,1,1,1,2,3,4,5,5,5,3,3,3,3,2,2,2,4,3]
>>> plateaus = [lst[i] for i in range(1, len(lst)-1) if lst[i] == lst[i-1] 
...                                                  or lst[i-1] <= lst[i] >= lst[i+1] 
...                                                  or lst[i-1] >= lst[i] <= lst[i+1]]
>>> condensed = [k for k, g in itertools.groupby(plateaus)]
>>> [y-x for x, y in zip(condensed, condensed[1:])]
[4, -2, -1, 2]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM