[英]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.