我目前正在寻找能够通过以下列表的算法:[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“跟随)。我希望这很清楚。非常感谢
答案 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]