简体   繁体   中英

Including first and last elements in list comprehension

I would like to keep the first and last elements of a list, and exclude others that meet defined criteria without using a loop. The first and last elements may or may not have the criteria of elements being removed.

As a very basic example,

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

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

returns ['b', 'b']

I need ['a','b','b','a']

I can split off the first and last values and then re-concatenate them together, but this doesn't seem very Pythonic.

You can use slice assignment:

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

Yup, it looks like dawg's and jez's suggested answers are the right ones, here. Leaving the below for posterity.


Hmmm, your sample input and output don't match what I think your question is, and it is absolutely pythonic to use slicing:

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' ]

Here's a list comprehension that explicitly makes the first and last elements immune from removal, regardless of their value:

>>> 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']

Try this:

>>> 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']

Although, the list comprehension is becoming unwieldy. Consider writing a generator like so:

>>> 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']

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM