2015-10-09 10 views
5

Voglio trovare una sequenza di n interi consecutivi in ​​una lista ordinata e restituire quella sequenza. Questo è il meglio che riesco a capire (per n = 4), e non consente all'utente di specificare un n.Trova/estrai una sequenza di numeri interi in una lista in python

my_list = [2,3,4,5,7,9] 
for i in range(len(my_list)): 
    if my_list[i+1] == my_list[i]+1 and my_list[i+2] == my_list[i]+2 and my_list[i+3] == my_list[i]+3: 
     my_sequence = list(range(my_list[i],my_list[i]+4)) 

my_sequence = [2,3,4,5] 

Ho appena realizzato questo codice non funziona e restituisce un "indice di fuori gamma" errore, quindi dovrò avere a pasticciare con la gamma del ciclo for.

+0

Con una sequenza intendi una differenza di 1? –

+0

@AnandSKumar sì, anche se il codice precedente potrebbe essere facilmente modificato per cercare una sequenza con una differenza di "m" – chiiidog

+0

E ci sarebbe solo una tale sequenza? –

risposta

1

Un modo breve e conciso è quello di riempire un array di numeri ogni volta che si trova il numero intero successivo è il numero intero più 1 (finché non si hanno già N numeri consecutivi nell'array), e per qualsiasi altra cosa, possiamo svuotare il array:

arr = [4,3,1,2,3,4,5,7,5,3,2,4] 
N = 4 
newarr = [] 

for i in range(len(arr)-1): 
    if(arr[i]+1 == arr[i+1]): 
     newarr += [arr[i]] 
     if(len(newarr) == N): 
      break 
    else: 
     newarr = [] 

Quando viene eseguito il codice, newarr sarà:

[1, 2, 3, 4] 
1

creare una lista dei risultati master nidificate, quindi passare attraverso my_sorted_list e aggiunge ogni articolo a uno l'ultimo elenco nel master (se discontinuo) o ad una nuova lista nel master (se co continua che):

>>> my_sorted_list = [0,2,5,7,8,9] 
>>> my_sequences = [] 
>>> for idx,item in enumerate(my_sorted_list): 
...  if not idx or item-1 != my_sequences[-1][-1]: 
...   my_sequences.append([item]) 
...  else: 
...   my_sequences[-1].append(item) 
... 
>>> max(my_sequences, key=len) 
[7, 8, 9] 
0
#size = length of sequence 
#span = the span of neighbour integers 
#the time complexity is O(n) 
def extractSeq(lst,size,span=1): 
    lst_size = len(lst) 
    if lst_size < size: 
     return [] 
    for i in range(lst_size - size + 1): 
     for j in range(size - 1): 
      if lst[i + j] + span == lst[i + j + 1]: 
       continue 
      else: 
       i += j 
       break 
     else: 
      return lst[i:i+size] 
    return [] 
3

Ecco una soluzione straight-forward. Non è efficiente come potrebbe essere, ma andrà bene a meno che tu non abbia liste molto lunghe:

myarray = [2,5,1,7,3,8,1,2,3,4,5,7,4,9,1,2,3,5] 
for idx, a in enumerate(myarray): 
    if myarray[idx:idx+4] == [a,a+1,a+2,a+3]: 
     print([a, a+1,a+2,a+3]) 
     break 
Problemi correlati