Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何比较列表中的元素_Python_Algorithm_List_Slice - Fatal编程技术网

Python 如何比较列表中的元素

Python 如何比较列表中的元素,python,algorithm,list,slice,Python,Algorithm,List,Slice,我在查找最大值和最小值的算法方面遇到了一些问题,不是算法本身,而是实现,让我解释一下: 假设列表为n=[0,1,1,2,3,5,8,13,-1,99];lenn=10 然后globalMin,globalMax=n[0],n[0]从列表中跳过1次迭代 现在我要做的是通过“对”进行比较,因为我已经使用了n[0],所以我开始比较n[1]和n[2]以找到这两个值之间的最大值和最小值,然后将其与y全局最小值、最大值进行比较,然后再比较n[3]和n[4]并比较 nm和我的全局值,然后n[5]和n[6]。。

我在查找最大值和最小值的算法方面遇到了一些问题,不是算法本身,而是实现,让我解释一下:

假设列表为n=[0,1,1,2,3,5,8,13,-1,99];lenn=10 然后globalMin,globalMax=n[0],n[0]从列表中跳过1次迭代

现在我要做的是通过“对”进行比较,因为我已经使用了n[0],所以我开始比较n[1]和n[2]以找到这两个值之间的最大值和最小值,然后将其与y全局最小值、最大值进行比较,然后再比较n[3]和n[4]并比较 nm和我的全局值,然后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]

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

您可以首先检查列表的长度,如果它是奇数长度,那么您可以将最后一个元素附加到列表的末尾。追加是一个O1操作,因此不会影响时间复杂度

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

您可以首先检查列表的长度,如果它的长度为奇数,则可以将最后一个元素附加到列表的末尾。追加是一个O1操作,因此不会影响时间复杂度

您可以使用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风格的实现:

from itertools import zip_longest

n = [0, 1, 1, 2, 3, 5, 8, 13, -1, 99]
global_min = global_max = n[0]

groups = [iter(n)] * 2
for a, b in zip_longest(*groups):
    if b is not None:
        if a > b:
            local_min, local_max = b, a
        else:
            local_min, local_max = a, b
    else:
        local_min = local_max = a
    if local_min < global_min:
        global_min = local_min
    if local_max > global_max:
        global_max = local_max

print(global_min, global_max)
我们通过在2.x中使用相同迭代器的列表对项目进行分组。然后我们在上面循环,这会给我们成对的值。然后我们做一个检查,如果该值是最后一个,我们将其指定为local_min和local_max,否则,我们将比较这两个值并根据需要进行指定


然后,我们比较并可能更新global_min和global_max。

我认为这是最具python风格的实现:

from itertools import zip_longest

n = [0, 1, 1, 2, 3, 5, 8, 13, -1, 99]
global_min = global_max = n[0]

groups = [iter(n)] * 2
for a, b in zip_longest(*groups):
    if b is not None:
        if a > b:
            local_min, local_max = b, a
        else:
            local_min, local_max = a, b
    else:
        local_min = local_max = a
    if local_min < global_min:
        global_min = local_min
    if local_max > global_max:
        global_max = local_max

print(global_min, global_max)
我们通过在2.x中使用相同迭代器的列表对项目进行分组。然后我们在上面循环,这会给我们成对的值。然后我们做一个检查,如果该值是最后一个,我们将其指定为local_min和local_max,否则,我们将比较这两个值并根据需要进行指定


然后,我们比较并可能更新global_min和global_max。

我假设您这样做是作为一个教育规模,但值得注意的是,在任何实际情况下,minn和maxn都能最好地实现这一点。是的,这只是出于教育目的,这就是为什么我被要求不使用任何外部库或函数,只有当,while,elif,for,etc.min和max是内置函数,而不是外部函数时,才需要使用基本语句,但我明白你的意思。值得注意的是,按索引进行迭代效率低、不灵活、难以阅读且容易失败,应该避免。如果项目数量是奇数会怎么样?@Lattyware是的,这就是我们这样做的原因,由于我们试图理解算法的O分类,我的老师向我们展示了遍历列表是多么低效。谢谢你提醒我那些是内置的!我会假设你这样做是为了教育,但值得注意的是,在任何实际情况下,这最好是通过minn,maxn实现的。是的,这只是为了教育目的,这就是为什么我被要求不要使用任何外部库或函数,它必须只与基本语句一起,如果,而,elif,for,最小值和最大值是内置函数,不是外部函数,但我明白你的意思。值得注意的是,按索引进行迭代效率低、不灵活、难以阅读且容易失败,应该避免。如果项目数量是奇数会怎么样?@Lattyware是的,这就是我们这样做的原因,由于我们试图理解算法的O分类,我的老师向我们展示了遍历列表是多么低效。谢谢你提醒我那些是内置的!这正是我想要的!非常感谢,我不知道迭代器的存在。有那么多我仍然不知道,非常感谢!!如果列表中的项目数为奇数,则会出错。使用带有范围的for循环来处理迭代器似乎也非常迂回。这正是我想要的!非常感谢,我不知道迭代器的存在。有那么多我仍然不知道,非常感谢!!如果列表中的项目数为奇数,则会出错。使用带有范围的for循环来处理迭代器似乎也是非常迂回的。