簡體   English   中英

在列表中找到連續數字大於“ n”的最后一個數字

[英]find the last number in list with consecutive number of numbers greater than “n”

我有一個像這樣的清單

mixed_list = [None, 1, 3, None, 5, 6, 7, 8, 10, None, None, 11, 12, None, None]

我需要在此列表中找到連續的數字大於n的最后一個數字,在這種情況下為2 所以...

輸入: mixed_list輸出: 10

我知道我必須編寫一個循環,但是之后不知道如何開始。 有人可以告訴我如何入門嗎?

首先嘗試reverse列表並開始對其進行iterating

標記找到的first number並在其后開始計數連續的數字

If在計數器大於n之前獲得None ,然后重置計數器,則next number after None標記next number after None並繼續迭代。

Else ,您的標記號碼就是答案:)

下面的代碼:

def find_the_number(the_list, n):
    counter = 0
    possible_answer = None
    for i in reversed(the_list):
        if i is not None:
            if counter == 0:
                possible_answer = i
            counter += 1
        else:
            counter = 0
        if counter > n:
            return possible_answer


mixed_list = [None, 1, 3, None, 5, 6, 7, 8, 10, None, None, 11, 12, None, None]
cons_number = 2
print(find_the_number(mixed_list, cons_number))
>>> next((v[-1] for v in reversed(list(zip(*[mixed_list[i:] for i in range(n+1)]))) if all(v)), None)
>>> 10

說明

zip(*[mixed_list[i:] for i in range(n+1)將返回n + 1個連續數字作為元組

>>> list(zip(*[mixed_list[i:] for i in range(n+1)]))
[(None, 1, 3), (1, 3, None), (3, None, 5), (None, 5, 6), (5, 6, 7), (6, 7, 8), (7, 8, 10), (8, 10, None), (10, None, None), (None, None, 11), (None, 11, 12), (11, 12, None), (12, None, None)]

然后您將其反轉

>>> list(reversed(list(zip(*[mixed_list[i:] for i in range(n+1)]))))
[(12, None, None), (11, 12, None), (None, 11, 12), (None, None, 11), (10, None, None), (8, 10, None), (7, 8, 10), (6, 7, 8), (5, 6, 7), (None, 5, 6), (3, None, 5), (1, 3, None), (None, 1, 3)]

然后,僅在元組包含所有數字時才對其進行過濾,並僅從元組中返回第一個數字

>>> [v[-1] for v in reversed(list(zip(*[mixed_list[i:] for i in range(n+1)]))) if all(v)]
[10, 8, 7]

您要做的就是從返回的列表中獲取第一個號碼:)

這樣的事情應該起作用。 警告:未經測試,只需在此處輸入

minimum_consecutives = 2
mixed_list = [None, 1, 3, None, 5, 6, 7, 8, 10, None, None, 11, 12, None, None]
consecutive_non_nulls = 0
last_item = None
for item in mixed_list:
   if item is not None:
       consecutive_non_nulls = consecutive_non_nulls + 1
   else:
       if consecutive_non_nulls > minimum_consecutives:
           break;
       consecutive_non_nulls = 0
   last_item = item
print(last_item)

我會在反向列表上使用itertools.groupby

from itertools import groupby

n = 2
lst = [None, 1, 3, None, 5, 6, 7, 8, 10, None, None, 11, 12, None, None]
groups = groupby(reversed(lst), lambda x: isinstance(x, int))
result = next((grplist[0] for p, grp in groups
                          for grplist in [list(grp)] 
                          if p and len(grplist) > n), None)

我接受了答案,但意識到他想念我,但由於Igor S,我修改了他的代碼,這項工作得以實現。

def get_last_number2(list, n=2):
    counter = 0
    possible_answer = None

    for i in list:
      if i is not None:
         possible_answer = i
         counter +=1
      else:
         if counter>n:
            return possible_answer
         counter = 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM