2012-12-19 4 views
9

Voglio una lunga lista, ad esempio [1,2,3,4,5,15,16,17,18,19] come esempio. Per inizializzare questo, provo a digitare:Inizializzazione dell'elenco Python utilizzando più istruzioni di intervallo

new_list = [range(1,6),range(15,20)] 

Tuttavia questo non fare quello che voglio, il ritorno:

[[1, 2, 3, 4, 5], [15, 16, 17, 18, 19]] 

Quando faccio:

len(new_list) 

Esso restituisce 2, invece dei 10 elementi che volevo (dato che ha fatto 2 liste all'interno della lista). Ovviamente in questo esempio ho potuto solo scrivere fuori quello che voglio, ma sto cercando di fare questo per alcuni elenchi iterate strani che vanno come:

new_list = [range(101,6284),8001,8003,8010,range(10000,12322)] 

Desiderando una lista 1-D al posto di una lista di liste (o come meglio si chiama). Immagino che sia davvero facile e mi manca, ma dopo un po 'di ricerche non ho trovato nulla di troppo utile. Qualche idea?

risposta

14

Prova questo per Python 2.x:

range(1,6) + range(15,20) 

Oppure, se si sta utilizzando Python3.x, provate questo:

list(range(1,6)) + list(range(15,20)) 

per trattare con gli elementi in-tra, per Python 2.x:

range(101,6284) + [8001,8003,8010] + range(10000,12322) 

E infine per trattare con elementi in-tra, per Python 3.x:

list(range(101,6284)) + [8001,8003,8010] + list(range(10000,12322)) 

Gli aspetti chiave da ricordare è che in Python 2.x range restituisce una lista e in Python 3 .x restituisce un iterabile (quindi deve essere esplicitamente convertito in una lista). E quello per aggiungere liste insieme, puoi usare l'operatore +.

+0

+1 per codice molto semplice ed efficiente, non sapevo che potevi fare solo aggiungere liste! : D – jackcogdill

+0

C'è un modo semplice per inserire numeri interi in mezzo, tutto in una riga? Immagino che potrei aggiungerne uno, ma c'è un po 'di spaziatura sporadica tra le dichiarazioni di lista, grazie per l'aiuto. – jackd

+0

@jackd ha aggiornato la mia risposta. Basta comprimerli in un elenco di elementi singoli, in questo modo: 'intervallo (1,3) + [3] + intervallo (4,6)' –

2

range restituisce una lista per cominciare, quindi è necessario o li concatenare assieme + o utilizzare append() o extend().

new_list = range(1,6) + range(15,20) 

o

new_list = range(101,6284) 
mew_list.extend([8001,8003,8010]) 
mew_list.extend(range(10000,12322)) 

In alternativa, è possibile utilizzare itertools.chain() come indicato nella risposta di Shawn Chin.

7

È possibile utilizzare itertools.chain per uniformare l'output delle chiamate range().

import itertools 
new_list = list(itertools.chain(xrange(1,6), xrange(15,20))) 

Utilizzando xrange (o semplicemente range() per python3) per ottenere un iterabile e concatenamento insieme significa solo un oggetto elenco viene creato (nessuna lista intermedi necessari).

Se è necessario inserire i valori intermedi, è sufficiente includere una lista/tupla nella catena:

new_list = list(itertools.chain((-3,-1), 
           xrange(1,6), 
           tuple(7), # make single element iterable 
           xrange(15,20))) 
+0

+1 questo metodo funziona lo stesso per python2 .x e 3.x – twneale

+1

Per includere un singolo valore, assicurati che sia un singolo elemento in un iterabile, ad es. 'tuple (8001)' o '[8001]' o 'list (8001)', altrimenti aggiungerà '8',' 0', '0', e' 1'. – kreativitea

+0

Grazie, vale sicuramente la pena segnalarlo. Aggiornerà la risposta. –

0

Prova questo:

from itertools import chain 

new_list = [x for x in chain(range(1,6), range(15,20))] 
print new_list 

uscita come volevi:

 
[1, 2, 3, 4, 5, 15, 16, 17, 18, 19] 
0

vorrei proporre la versione ua senza +

import operator 
a = list(range(1,6)) 
b = list(range(7,9)) 
print(operator.concat(a,b))