【问题标题】:How to print out the indexes in a list with repetitive elements如何打印出具有重复元素的列表中的索引
【发布时间】:2013-11-06 20:48:20
【问题描述】:

我想创建一个函数,它在参数中有一个列表和一个阈值。 此函数将返回列表中的值的 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]

【问题讨论】:

    标签: python list indexing


    【解决方案1】:

    使用zipenumerateenumerate 将返回索引以及项目:

    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]
    

    【讨论】:

    • 这太复杂了,为什么在enumerate 中使用zip
    • 如果我想迭代生成器而不是列表怎么办?这还能用吗?
    • @GamesBrainiac 这已经够复杂了,而且是一种非常惯用的迭代相邻对的方式。
    • @Lalala no: [1:] 不适用于生成器迭代器,此代码尝试读取可迭代对象两次。
    • @hcwhsa 还不如使用izip :)
    【解决方案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]
    

    下次请三思而后投反对票

    【讨论】:

    • 是的,我试过了,但由于列表中有重复的元素,它不起作用。
    • 非虚拟机。我的意思是 ls.index(element, [start,[end]]) 可以通过使用循环来更新 start 来返回多个
    • 我已经改进了您的缩进和异常处理,但它仍然不起作用。试试b = [1,2,5,6] 看看结果。
    • 很抱歉,在这种情况下,start 应该首先是 -1。
    • 问题是因为如果 start=0 在第一个位置,它不会在列表中查找第一个项目。谢谢指出我的错。
    【解决方案3】:
    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
    

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

    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
    

    工作example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-24
      • 2016-12-28
      • 1970-01-01
      • 2019-02-03
      • 2012-05-13
      • 2013-06-21
      • 1970-01-01
      • 2021-06-25
      相关资源
      最近更新 更多