包括列表理解中的第一个和最后一个元素

时间:2017-01-13 20:49:48

标签: python

我想保留列表的第一个和最后一个元素,并在不使用循环的情况下排除符合定义条件的其他元素。第一个和最后一个元素可能有也可能没有删除元素的标准。

作为一个非常基本的例子,

rename

返回$allowed = array('png', 'jpg', 'gif', 'xlsx','zip'); if(isset($_FILES['upl']) && $_FILES['upl']['error'] == 0){ $extension = pathinfo($_FILES['upl']['name'], PATHINFO_EXTENSION); if(!in_array(strtolower($extension), $allowed)){ echo '{"status":"error"}'; exit; } $destination = "uploads/update.xlsx"; if(file_exists($destination)){ rename($destination, "uploads/" . date("Y-m-d\TH:i:sP") . ".xlsx"); } if(move_uploaded_file($_FILES['upl']['tmp_name'], $destination)){ echo '{"status":"success"}'; exit; } } echo '{"status":"error"}'; exit;

我需要aList = ['a','b','a','b','a'] [x for x in aList if x !='a']

我可以拆分第一个和最后一个值,然后将它们重新连接在一起,但这看起来并不像Pythonic。

4 个答案:

答案 0 :(得分:8)

您可以使用切片分配:

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

答案 1 :(得分:5)

是的,看起来像dawg和jez的建议答案是正确的,在这里。离开下面为后人。

嗯,您的样本输入和输出与我认为您的问题不符,使用切片绝对是pythonic:

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

答案 2 :(得分:4)

这是一个列表理解,它明确地使第一个和最后一个元素免于删除,无论它们的值如何:

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

答案 3 :(得分:0)

试试这个:

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

虽然,列表理解变得笨拙。考虑像这样写一个生成器:

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