2016-08-05 12 views
1

Ich habe nach einem relevanten Thread dafür gesucht, aber ich kann nichts finden.Einen Teil einer Liste in Python kopieren

Ich habe ein Array:

x = [a,a,a,b,a,a] 

Ich möchte die Elemente des Arrays in ein neues Array kopieren, bis ich ‚b‘ gefunden. Ich habe versucht, dies mit einer Schleife zu tun, aber ich bekomme einen Fehler, dass "y ist nicht definiert", versuchte ich initialisieren y, aber das hat auch nicht funktioniert. Irgendwelche Ideen? Ich bin mir sicher, dass es einen besseren Weg dafür gibt.

for ii in x: 
    if x[ii].find(num) == 0: 
     break 
    else: 
     y[ii] = x[ii] 
+1

Was meinst du mit 'x [ii] .find (num)'? Sie haben eine Liste von ganzen Zahlen oder Strings? –

+0

Sorry, ich habe Integer als Beispiel verwendet, es ist ein Array von Strings. Fest. – iheartcpp

Antwort

2
y = [] 
for e in x: 
    if e == 2: 
     break 
    y.append(e) 

?

+1

Auch bekannt als 'y = x [: x.index (2)]'. – Mephy

+0

Mephy: richtig. Ich dachte nur, der Autor braucht eine einfache Implementierung. –

+0

@IgorPomaranskiy Neben der _implementation_, einige _explanation_ wäre auch nett, –

2

könnten Sie itertools.takewhile verwenden:

>>> x = [1,1,1,2,1,1] 
>>> import itertools 
>>> y = list(itertools.takewhile(lambda i: i != 2, x)) 
>>> y 
[1, 1, 1] 

Wenn eine Schleife verwenden, müssen Sie y.append verwenden; Wenn Sie tun, dann erhalten Sie eine IndexError, wie Sie versuchen, z. das erste Element eines Arrays, das null Elemente enthält. Auch, wenn Sie wie diese Schleife for ii in x: dann ii ist bereits das Element von x, d. H. Sie tun nicht müssen x[ii] tun. In Ihrem Fall gab dies keine Ausnahme, da x[1] ein gültiges Element von x wäre, aber es wäre nicht das, was Sie erwartet haben.

2

Versuchen Sie folgendes:

x = [1,1,1,2,1,1] 
b = 2 

try: 
    y = x[:x.index(b)] 
except ValueError: 
    y = x[:] 

Zum Beispiel:

In [10]: x = [1,1,1,2,1,1] 
    ...: b = 2 
    ...: 
    ...: try: 
    ...:  y = x[:x.index(b)] 
    ...: except ValueError: 
    ...:  # b was not found in x. Just copy the whole thing. 
    ...:  y = x[:] 
    ...: 

In [11]: y 
Out[11]: [1, 1, 1] 

list.index() See und die shallow-copy slice für weitere Informationen.

1

Weg, Dinge zu tun bekommen mit generator expression:

x = ['a', 'a', 'a', 'b', 'a', 'a'] 
items = list(next(iter([])) if item == 'b' else item for item in x) 
print items 
['a', 'a', 'a'] 
+0

Wow, mit 'next (iter ([]))' zu 'StopIteration' in einem Listenverständnis zu lösen. Ich bin mir nicht sicher, ob ich das verbessern sollte, aber sicherlich eine kreative Lösung. ;-) –

+0

@tobias_k danke, dein Kommentar ist besser als Upvoting))) –

+0

BTW, eigentlich ist das ein Generatorausdruck, kein Listenverständnis. Mit einem richtigen Listenverständnis würde das nicht funktionieren. –

0

Obwohl es irgendwie ähnlich wie Wills Antwort, aber es zeigt die Verwendung von slice Einbau-Slicing-Objekt in hier:

>>> x = ['a','a','a','b','a','a'] 
>>> s = slice(x.index('b')) 
>>> 
>>> x[s] 
['a', 'a', 'a'] 
+0

Kannst du diese Methode auch mit einem Objekt vom Typ 'dict' verwenden? – iheartcpp

+0

Sie meinen eine Liste von Diktat? –

0

Ich würde das Array durch die index teilen:

>>> x = ['a','a','a','b','a','a'] 
>>> c = x.index('b') 
>>> x[:c] 
['a', 'a', 'a'] 
>>> x[c:] 
['b', 'a', 'a'] 
+0

Während dieses Code-Snippet die Frage lösen kann, [hilft eine Erklärung] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) wirklich, um die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch nicht, Ihren Code mit erläuternden Kommentaren zu überladen, da dies die Lesbarkeit sowohl des Codes als auch der Erklärungen verringert! –

Verwandte Themen