浏览列表并检查Python

时间:2016-07-01 14:09:49

标签: python list conditional-statements

我目前正在寻找能够通过以下列表的算法:[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,2,2,2,4,3]在此case,我会根据你的代码得到以下差异= lst = [4,-2,-1]然后停止。但是,我希望之后将“4-2”添加到列表中,因为“4”后跟一个小于“4”的数字(因此,向相反的方向 - 向上 - “2”后跟“ 4“跟随)。我希望这很清楚。非常感谢

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

您可以使用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]

我认为现在我得到了你想要的东西:你想要任何连续的&#34;高原&#34;在列表中,高原是重复值,或局部最小值或最大值。这有点复杂,需要几个步骤:

>>> 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]