我在算法上遇到了一些问题(要找到最大值和最小值),不是算法本身而是实现,让我解释一下:
假设列表是n = [0,1,1,2,3,5,8,13,-1,99]len(n) = 10
然后从列表中跳过一个迭代
现在我要做的是用“pairs”来比较,因为我已经用了n[0],所以我开始比较n[1]和n[2]来找出这两个值之间的最大值和最小值,然后将其与y global min,max values,然后n[3]和n[4]进行比较
用我的全局值,然后是n[5]和n[6]…在我必须比较n(9)和n(10)之前,如你所看到的,n(10)不存在于我的列表中。我想我可以用下面的代码通过列表切片来解决这个问题:

 for i in range(1, len(n), 2):

    if n[i:i+1] > n[i+1:i+2]:
      minl, maxl = n[i+1:i+2], n[i:i+1] # minl = local min; maxl = local max
    else:
      maxl, minl = n[i+1:i+2], n[i:i+1]

但是,如果我的最后一个元素只有一个(如上面的例子所示),那么这将不起作用,所以,正如您所猜测的,如果min或max是我列表中的最后一个元素,它将被忽略。我一直在尝试用索引或列表切片来解决这个问题,但是一点运气都没有,有什么建议吗?我必须以一种“蟒蛇式”的方式来做,并确保在不使用导入的情况下尽可能简单和简短。我已经计算出基于下一幅图像的其余算法:Image

最佳答案

可以先检查列表的长度,如果列表的长度为奇数,则可以在列表的末尾追加最后一个元素。追加是一个O(1)操作,不会影响时间复杂度。
您可以使用while循环:

In [78]: lis = [0,1,1,2,3,5,8,13,-1]

In [79]: if len(lis)%2 !=0 :  #if the list is of odd length then append the last item to it
    lis.append(lis[-1])
   ....:

In [80]: i=0

In [81]: while i<len(lis)-1:
    if lis[i]>lis[i+1]:
        local_max,local_min=lis[i],lis[i+1]
    elif lis[i]<lis[i+1]:
        local_max,local_min=lis[i+1],lis[i]
    else:
        local_max,local_min=lis[i],lis[i+1]
    print local_min,local_max
    i+=2
   ....:
0 1
1 2
3 5
8 13
-1 -1

或者可以使用迭代器:
In [86]: it=iter(lis)

In [87]: lis = [0,1,1,2,3,5,8,13,-1]

In [88]: if len(lis)%2 !=0 :
    lis.append(lis[-1])
   ....:

In [89]: it=iter(lis)

In [90]: for _ in xrange(len(lis)/2):
   ....:     a,b=next(it),next(it)
   ....:     if a>b:
   ....:         local_max,local_min=a,b
   ....:     elif a<b:
   ....:         local_max,local_min=b,a
   ....:     else:
   ....:         local_max,local_min=a,b
   ....:     print local_min,local_max
   ....:
0 1
1 2
3 5
8 13
-1 -1

关于python - 如何比较列表中的元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15284936/

10-14 11:01
查看更多