如何将一个索引与同一列表中的上一个索引进行比较?

问题描述:

我想让这个程序查看列表中的每个以前的数字,并确定该数字是否大于它。如果是的话,它应该记录多大倍,并在最后返回。即计数(我使用num作为变量)从0开始。但是10大于7,所以num变为1.现在7不大于20,所以计数保持不变。但是20大于15,所以count(num)是2,15大于4(count是3)。现在4不大于6(计数不变),并且6不大于下一个数字,因为没有下一个数字。这是我现在拥有的。我在想,lst [i]和lst [i + 1]是否需要用来引用索引呢?任何人都可以通过这个走过我?谢谢。如何将一个索引与同一列表中的上一个索引进行比较?

def count(lst): 
num = 0 
some sort of division here? then add to num variable? 

#main prog 
(count([10, 7, 20, 15, 4, 6])) 

def count(lst): 
    return sum(i > j for i,j in zip(lst[:-1], lst[1:])) 

下面我们一起压缩列表,通过一个偏移,以获得连续配对。然后我们比较每一对。布尔值是整数,所以我们可以将它们相加以产生最终计数。

试试这个:

def count(lst): 
    answer = 0 
    for i,num in enumerate(lst[1:], 1): 
     answer += num < lst[i-1] 
    return answer 

事实证明,加入布尔值整数强制bool s到作为被处理int S以及(True1False0)。所以你可以使用它来制作更易读的代码。

希望这有助于

+0

应该返回3.这将返回2 – user1487497 2012-07-07 01:30:30

+0

+1。不知道关于布尔。 – 2012-07-07 01:30:42

+0

@ user1487497:哦,我看到了问题。我很快扫描了你的问题,这就是为什么我错过了一些东西。看看我的编辑 – inspectorG4dget 2012-07-07 01:35:07

import numpy as np 
def count(lst): 
    return sum(np.diff(lst)>0) 

diff给连续元素之间的差别,和返回的积极差异的数量。

从迭代工具食谱:

from itertools import tee, izip 

def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

def count(lst): 
    return sum(a>b for a,b in pairwise(lst)) 

然后

count([10, 7, 20, 15, 4, 6]) # => 3 
+0

我看着这个,并首先质疑为什么'a,b = tee(可迭代)'比'a,b = iter(可迭代),iter(可迭代)'更可取?然后,我想到如果迭代是一个生成器,那么你真的没有机会在它上面创建两个迭代器。但是tee将会创建一个虚拟的第二个迭代器,而不会实际迭代两次。 – PaulMcG 2012-07-07 07:06:15