2016-04-11 6 views
0

Ich möchte die ersten beiden Listen aus einer bestimmten verschachtelten list kopieren. Ich habe folgendes:Elegante Möglichkeit zum Kopieren von Elementen von Listen zu einem anderen

list = [[10,20],[30,40,50],[0,0],[1,2,3]] 
sList = [] 
x = 0 
for i in list: 
    if x == 2: 
     break 
    sList.append(i) 
    x+=1 
print ("%s" % sList) 

Meine Frage ist: Gibt es eine andere elegante Art und Weise?

+0

Schneiden Was ist die Ausgabe, die Sie wollen? – snakecharmerb

+0

Ich möchte die ersten beiden Listen bekommen "[10,20], [30,40,50]". Mit anderen Worten, die ersten beiden Listen werden extrahiert. Meine obige Methode scheint nicht elegant und ich weiß nicht, wie man es besser macht –

+1

@FriddyJoe, wollen Sie tatsächliche Kopien der Unterlisten oder nur die Verweise auf die Unterlisten? –

Antwort

0

können Sie schneiden verwenden:

sList = list[:2] 
2

Gerade schneiden verwenden, um die ersten beiden Elemente aus einer Liste zu erhalten. Verwenden Sie auch keine Liste, wie es Schatten der eingebaute in list:

list_ = [[10,20],[30,40,50],[0,0],[1,2,3]] 

print(list_[:2]) 

Ausgang:

[[10, 20], [30, 40, 50]] 

Eine einfache Möglichkeit des Schneidens zu denken, ist wie folgt:

list_[start:end:step] 

Wie Sie mir klar gemacht haben, möchten Sie diese Daten tatsächlich in eine separate Liste extrahieren. Daher möchten Sie wahrscheinlich das Kopiermodul verwenden und deecopy verwenden.

Per Docs:

Für Sammlungen, die wandelbar sind oder enthalten veränderbare Elemente, eine Kopie manchmal benötigt, um eine eine Kopie ändern können die andere ohne Änderung.

Daher kann der Code wie folgt aussehen:

from copy import deepcopy 

sub_list = deepcopy(list_[:2]) 
+1

Wahrscheinlich wollen Sie 'copy.deepcopy (l [: 2])', wenn das OP tatsächlich eine Kopie oder 'liste (map (liste, (l [: 2]))) will' –

+1

Sie haben Recht. Ich sehe jetzt, dass sie tatsächlich eine neue Liste erstellen. Ich dachte, sie drucken es einfach aus irgendeinem Grund. Ich habe @PadraicCunningham aktualisiert. Danke noch einmal. Sie haben ein paar andere gute Änderungen an meinen anderen Antworten vorgeschlagen. Wirklich schätzen Sie die Revisionen. – idjaw

0
>> list = [[10,20],[30,40,50],[0,0],[1,2,3]] 
>> sList = list[:2] 
>> print (sList) 
[[10, 20], [30, 40, 50]] 
+0

Das ist wirklich elegant. Ich hatte eine Ahnung, dass Python etwas Elegantes beinhalten würde, aber seit ich ein Anfänger bin, konnte ich es nicht verstehen. Danke :) –

+2

Was ist der Punkt von 'print ("% s "% sList)'. Warum nicht einfach 'sList' drucken? – idjaw

+0

Um den Code dem Original ähnlicher zu machen .. Aus dem gleichen Grund habe ich die var 'sList' anstelle von 'sub_list' benannt – Francesco

0

Nun, für die beispielsweise nur

sList = [oList[0], oList[1]] 

oder äquivalent

sList = oList[:2] 

In Ihrem s reichlicher Code sList bezieht sich auf die gleichen Listen wie das Original (die definitiv nicht list genannt werden sollen) - wenn Sie tatsächlich Kopien mögen,

sList = [list(e) for e in oList[:2]] 

verwenden, um die verschachtelten Listen zu duplizieren

0

Sie können nur nehmen Liste slice

Slist = list[0:2] 
0
my_list = [[10, 20], [30, 40, 50], [0, 0], [1, 2, 3]] 

sliced_list = [sub_list[:] for sub_list in my_list[:2]] 

>>> sliced_list 
[[10, 20], [30, 40, 50]] 

anzumerken, dass [:] kopiert die Liste, so dass jede Änderung in der entweder die ersten beiden Elemente my_list oder sliced_list w Im Gegensatz zu einfachem Slicing wird es nicht im anderen reflektiert.

my_list[:2] wählt die ersten zwei Unterlisten aus Ihrer Liste aus.

Slicing bezieht sich auf die tatsächliche Unterliste, keine Kopie, wie dieses Beispiel zeigt.

Kopie mit [:]

sliced_list[0].append(30) 

>>> sliced_list 
[[10, 20, 30], [30, 40, 50]] 

>>> my_list 
[[10, 20], [30, 40, 50], [0, 0], [1, 2, 3]] 

Mit

sliced_list = [sub_list for sub_list in my_list[:2]] 
sliced_list[0].append(30) 

>>> my_list 
[[10, 20, 30], [30, 40, 50], [0, 0], [1, 2, 3]] 
Verwandte Themen