【问题标题】:python get indexes of where number starts and ends in a listpython获取列表中数字开始和结束位置的索引
【发布时间】:2019-12-08 23:51:14
【问题描述】:

我有一个query,它是一个数字列表。我想获取出现数字1 的索引范围。范围从1 出现时开始,到它没有出现的索引处结束。我举了一个例子来说明这一点。

query= [0,0,0,0,0,1,1,1,0,1,0,0,1,1,0]

answer = [[5,8],[9,10],[12,14]]

注意:我不是在 Python 的列表中寻找某个值的第一个和最后一个索引。我正在寻找它们开始和结束的所有地方。

更新:从下面的一些建议答案看来,Itertools 对这些东西非常方便。

【问题讨论】:

标签: python list


【解决方案1】:

您可以使用itertools.dropwhile 来执行此操作。

>>> query = [0,0,0,0,0,1,1,1,0,1,0,0,1,1,0]
>>> n = 1
>>>
>>> from itertools import dropwhile
>>> itr = enumerate(query)
>>> [[i, next(dropwhile(lambda t: t[1]==n, itr), [len(query)])[0]] for i,x in itr if x==n]
[[5, 8], [9, 10], [12, 14]]

【讨论】:

  • 有趣...但没有最后的0 它失败了StopIteration
  • 很好...修复了它
【解决方案2】:

您也可以为此使用itertools.groupby。使用enumerate 获取索引,然后groupby 实际值,然后按值过滤,最后从组中获取第一个和最后一个索引。

>>> from itertools import groupby
>>> query = [0,0,0,0,0,1,1,1,0,1,0,0,1,1,0]
>>> [(g[0][0], g[-1][0]+1) for g in (list(g) for k, g in
...   groupby(enumerate(query), key=lambda t: t[1]) if k == 1)]
...
[(5, 8), (9, 10), (12, 14)]

【讨论】:

    【解决方案3】:
    query= [0,0,0,0,0,1,1,1,0,1,0,0,1,1,0]
    first = 0 # Track the first index in the current group
    ingroup = False # Track whether we are currently in a group of ones
    answer = []
    for i, e in enumerate(query):
        if e:
            if not ingroup:
                first = i
        else:
            if ingroup:
                answer.append([first, i])
        ingroup = e
    if ingroup:
        answer.append([first, len(query)])
    
    >>> answer
    [[5, 8], [9, 10], [12, 14]]
    

    我想你可能想要这样的东西。

    【讨论】:

    • 确实有效。我想知道是否有任何内置函数或库方法可以用更少的行/更简洁地做到这一点。
    • @piccolo 我明白你的意思了。我会多看一些,看看有没有什么有用的。
    【解决方案4】:

    你可以只使用基本的 for 循环和 if 语句你在哪里检查 其中“0”系列变为“1”系列,反之亦然

    query= [0,0,0,0,0,1,1,1,0,1,0,0,1,1,0]
    
    r_0 = []
    r_1 = []
    
    for i in range(len(query)-1):
        if query[i] == 0 and query[i+1] == 1:
            r_0.append(i+1) # [5, 9, 12]
        if query[i] == 1 and query[i + 1] == 0:
            r_1.append(i + 1) # [8, 10, 14]
    
    print (list(zip(r_0,r_1)))
    

    输出:

    [(5, 8), (9, 10), (12, 14)]
    

    【讨论】:

      【解决方案5】:

      希望这会有所帮助。这是一个没有循环的解决方案

      from itertools import chain
      
      query = [0,0,0,0,0,1,1,1,0,1,0,0,1,1,0]
      
      result = list(zip(
          filter(lambda i: query[i] == 1 and (i == 0 or query[i-1] != 1), range(len(query))),
          chain(filter(lambda i: query[i] != 1 and query[i-1] == 1, range(1, len(query))), [len(query)-1])
      ))
      print(result)
      

      输出是:

      [(2, 3), (5, 8), (9, 10), (12, 14)]
      

      【讨论】:

        【解决方案6】:

        想分享一个递归的方法

        query= [0,0,0,0,0,1,1,1,0,1,0,0,1,1,0]
        
        def findOccurrences(of, at, index=0, occurrences=None):
            if occurrences == None: occurrences = [] # python has a weird behavior over lists as the default
                                                   # parameter, unfortunately this neets to be done
        
            try:
                last = start = query.index(of, index)
        
                for i in at[start:]:
                    if i == of:
                        last += 1
                    else:
                        break
        
                occurrences.append([start, last])
                return findOccurrences(of, at, last, occurrences)
            except:
                pass
            return occurrences
        
        
        print(findOccurrences(1, query))
        print(findOccurrences(1, query, 0)) # Offseting
        print(findOccurrences(0, query, 9)) # Offseting with defaul list
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-15
          • 1970-01-01
          • 2020-11-19
          相关资源
          最近更新 更多