2012-12-19 11 views
9

Ich möchte eine lange Liste, sagen [1,2,3,4,5,15,16,17,18,19] als ein Beispiel. So initialisieren dies versuche ich Typisierung:Python-Liste Initialisierung mit mehreren Bereich Anweisungen

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

Dies gilt jedoch nicht tun, was ich will, Rückkehr:

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

Wenn ich tun:

len(new_list) 

It 2 ​​zurückkehrt, statt der 10 Elemente, die ich wollte (seit es 2 Listen innerhalb der Liste gemacht hat). Offensichtlich in diesem Beispiel könnte ich geben Sie einfach, was ich will, aber ich versuche, dies für einige ungerade iterierter Listen zu tun, die gehen wie:

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

eine 1-D-Liste statt einer Liste von Listen dem Wunsche (oder wie immer es am besten genannt wird). Ich schätze, das ist wirklich einfach und ich vermisse es, aber nach einigem Suchen habe ich nichts Nützliches gefunden. Irgendwelche Ideen?

Antwort

14

Versuchen Sie dies für Python 2.x:

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

Oder wenn Sie mit Python3.x, versuchen Sie dies:

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

für mit Elementen in-zwischen tun haben, für Python 2.x:

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

Und schließlich mit Elementen in-between, für Python 3.x für den Umgang:

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

die wichtigsten Aspekte zu erinnern ist, dass in Python 2.x range eine Liste und in Python 3 zurück .x gibt einen iterablen Wert zurück (muss also explizit in eine Liste konvertiert werden). Und zum Anhängen von Listen können Sie den Operator + verwenden.

+0

+1 für sehr einfachen und effizienten Code, wusste nicht, dass Sie nur Listen zusammen hinzufügen können! : D – jackcogdill

+0

Gibt es eine einfache Möglichkeit, einzelne Zahlen dazwischen in einer Zeile einzufügen? Ich schätze, ich könnte jeden einzelnen anhängen, aber es gibt ziemlich wenige sporadisch zwischen den Anweisungen der Liste, danke für die Hilfe. – jackd

+0

@jackd hat meine Antwort aktualisiert. Pack sie einfach in eine Single-Element-Liste, so: 'range (1,3) + [3] + range (4,6)' –

2

range gibt eine Liste mit zu beginnen, so müssen Sie sie entweder mit + zusammen verketten oder append() oder extend() verwenden.

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

oder

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

Alternativ können Sie itertools.chain() verwenden, wie in Shawn Chin Antwort gezeigt.

7

Sie können itertools.chain verwenden, um die Ausgabe Ihrer range() Anrufe zu glätten.

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

Mit xrange (oder einfach range() für python3) eine iterable zu bekommen und verketten sie zusammen bedeutet, dass nur ein Listenobjekt erstellt wird (keine Zwischenlisten erforderlich).

Wenn Sie Zwischenwerte einfügen müssen, sind nur eine Liste/Tupel in der Kette:

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

+1 Diese Methode funktioniert genauso für python2 .x und 3.x – twneale

+1

Um einen einzelnen Wert einzuschließen, stellen Sie sicher, dass es sich um ein einzelnes Element in einem iterierbaren Element handelt, z 'tuple (8001)' oder '[8001]' oder 'list (8001)', andernfalls werden '8',' 0', '0' und' 1' hinzugefügt. – kreativitea

+0

Danke, das ist es wert, darauf hingewiesen zu werden. Wird die Antwort aktualisieren. –

0

Try this:

from itertools import chain 

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

Ausgabe, wie Sie wollten:

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

ich möchte ua Version vorzuschlagen, ohne +

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