4

我想创建一个函数,它在参数中有一个列表和一个阈值。此函数将返回列表中的值的 int 索引列表,这些值比前一个值大阈值或更多。

到目前为止,我创建了:

def bigger(lst, number):
    x = []
    for a, prev in zip(lst[1:], number):
        diff = a - prev
       if diff >= 2:
            x.append(a)
    print(x)

bigger([0,1,-1,3,7,4,5,3,2,4,8],2)

这将打印出符合以下条件的数字列表,但我想打印索引列表。所以它应该打印出 [3, 4, 9, 10] (索引),但它打印出 [3, 7, 4, 8]

4

3 回答 3

4

使用zipandenumerateenumerate返回索引和项目:

def solve(lis, num):
    for i, (x, y) in enumerate(zip(lis, lis[1:]), 1):
        if y - x >= num:
            yield i

print list(solve([0,1,-1,3,7,4,5,3,2,4,8], 2))
#[3, 4, 9, 10]

如果您也想支持生成器,那么:

from itertools import tee, izip
def solve(lis, num):
    it1, it2 = tee(lis, 2)
    next(it2)  #drop first item
    for i, (x, y) in enumerate(izip(it1, it2), 1):
        print x, y
        if y - x >= num:
            yield i

print list(solve((x for x in [0,1,-1,3,7,4,5,3,2,4,8]), 2))
#[3, 4, 9, 10]
于 2013-10-28T07:01:43.450 回答
2

提示,你可以用它list.index(element, [start,[end]])来实现这个

@Games Brainiac,这是如何使用 list.index() 返回元素列表的位置

a = [1,2,3,4,5,5,6,6,7,8]
b = [2,5,6]
def findItem(a,b):
    index = []
    for item in b:
        start = -1
        while True:
            try:
                start = a.index(item, start+1)
                index.append(start)
            except ValueError:
                break;
    return index
print findItem(a,b)

就我而言,结果是:

[1, 4, 5, 6, 7]

下次请三思而后行

于 2013-10-28T06:56:41.477 回答
0
def bigger(l, num):
    _ret = []
    for i, var in enumerate(l[1:], start=1):
        if var - l[i - 1] >= num:
            _ret.append(i)

    return _ret

看看上面的代码,它做了你期望它做的事情。工作示例。以上,但在列表理解中:

def bigger(l, num):
    return [i for i, var in enumerate(l[1:], start=1) if var - l[i - 1] >= num]

您也可以由此制作生成器:

def bigger(l, num):
    for i, var in enumerate(l[1:], start=1):
        if var - l[i - 1] >= num:
            yield i

工作示例

于 2013-10-28T07:08:16.160 回答