2017-01-13 3 views
2

Ich möchte die ersten und letzten Elemente einer Liste behalten und andere ausschließen, die definierte Kriterien erfüllen, ohne eine Schleife zu verwenden. Das erste und das letzte Element können die Kriterien für das Entfernen von Elementen aufweisen oder nicht.Einschließlich erster und letzter Elemente im Listenverständnis

Als sehr einfaches Beispiel,

aList = ['a','b','a','b','a'] 

[x for x in aList if x !='a'] 

kehrt ['b', 'b']

Ich brauche ['a','b','b','a']

ich die ersten und letzten Werte abspalten kann und sie dann zusammen neu verketten, aber das doesn Es scheint sehr pythonisch zu sein.

+0

Lesen Sie über Liste Slicing. Es ist _sehr_ Pythonic. – DyZ

+2

Könnten Sie bitte mehr Klarheit darüber geben, was Sie wollen? Es ist nicht klar, ob Sie die ersten paar Elemente von der Vorder- und Rückseite der Liste und nicht den Rest in der Mitte wollen, oder wenn Sie bestimmte Werte aus der Mitte der Liste ausschließen und auch die allerersten und sehr behalten möchten letzte Elemente. – 2ps

Antwort

8

Sie slice Zuordnung verwenden können:

>>> aList = ['a','b','a','b','a'] 
>>> aList[1:-1]=[x for x in aList[1:-1] if x !='a'] 
>>> aList 
['a', 'b', 'b', 'a'] 
+2

Funktioniert genau dann, wenn das erste und letzte Zeichen "a" ist. Wenn nicht, werden sie zweimal eingefügt. Ich denke, das OP möchte wahrscheinlich einfach die ersten und letzten Elemente vor der Abwahl immunisieren, egal was sie sind. – jez

+0

@jez: Danke - geändert. – dawg

5

Yup, es sieht aus wie daug's und jez's vorgeschlagene Antworten sind die richtigen, hier. Das unten für Nachwelt verlassend.


Hmmm, Ihre Probe Eingang und Ausgang nicht übereinstimmen, was ich glaube, Ihre Frage ist, und es ist absolut pythonic Slicing zu verwenden:

a_list = ['a','b','a','b','a'] 
# a_list = a_list[1:-1] # take everything but the first and last elements 
a_list = a_list[:2] + a_list[-2:] # this gets you the [ 'a', 'b', 'b', 'a' ] 
+1

Ich bin mir nicht sicher, ob das ihre Frage beantwortet. Wie ich es gelesen habe, kann die Liste beliebig lang sein, und OP möchte die erste, letzte und jede in der Mitte behalten, die ihrer Bedingung entspricht. In dieser Hinsicht ist die Lösung von Dawg besser – nbryans

+0

Ja, das ist 100% nicht, wie ich "alle anderen" lese. – 2ps

+0

Sie haben Recht, dass die Formulierung mehrdeutig ist. Du parsierst den Text, den OP geschrieben hat, und ich bin (und Kumpel) analysiere das Beispiel. Ich denke, wir brauchen OP, um hier zu klären. – nbryans

4

Hier ist ein Listenverständnis, das das erste und das letzte Element unabhängig vom Entfernen explizit vor dem Entfernen schützt:

>>> aList = ['a', 'b', 'a', 'b', 'a'] 
>>> [ letter for index, letter in enumerate(aList) if letter != 'a' or index in [0, len(x)-1] ] 
['a', 'b', 'b', 'a'] 
0

Versuchen Sie folgendes:

>>> list_ = ['a', 'b', 'a', 'b', 'a'] 
>>> [value for index, value in enumerate(list_) if index in {0, len(list_)-1} or value == 'b'] 
['a', 'b', 'b', 'a'] 

Obwohl die Liste Verständnis unhandlich immer. Schreiben Sie einen Generator wie folgt:

>>> def keep_bookends_and_bs(list_): 
...  for index, value in enumerate(list_): 
...   if index in {0, len(list_)-1}: 
...    yield value 
...   elif value == 'b': 
...    yield value 
... 
>>> list(keep_bookends_and_bs(list_)) 
['a', 'b', 'b', 'a'] 
Verwandte Themen