给定一个列表,从列表中删除索引0、4、5(如果存在)

时间:2019-03-13 03:36:33

标签: python

下面是我的答案。我想知道是否有一种方法可以同时删除索引0、4、5,以使其看起来更明智。谢谢

def remove_item_045(a_list):
    if len(a_list) == 0:
        return []
    elif len(a_list) >= 1 and len(a_list) < 4:
        del(a_list[0])
    elif len(a_list) <= 5:
        del(a_list[0])
        del(a_list[3])
    else:
        del(a_list[0])
        del(a_list[3])
        del(a_list[3])
    return a_list

4 个答案:

答案 0 :(得分:4)

解决问题的Python方法不是删除不需要的东西,而是保留想要的东西:

a_list = list(range(10))
a_list
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a_list = [item for i,item in enumerate(a_list) if i not in {0,4,5}]
a_list
#[1, 2, 3, 6, 7, 8, 9]

答案 1 :(得分:1)

首先:不要使用del(list[index]),而要使用list.pop(index)

第二个:不用使用一堆if语句来确保没有错误,而是将所有内容放在try:块中,并忽略所得到的异常。一旦您尝试删除列表中没有的索引,该代码将引发错误,您可以将其用作退出的提示:

def remove_item_045(a_list):
    try:
        a_list.pop(0)   # remove index 0
        a_list.pop(3)   # remove index 4
        a_list.pop(3)   # remove index 5
    except e:
        pass
    return a_list

答案 2 :(得分:0)

您可以使用列表切片。

def remove_item_045(a_list):
    return a_list[1:4] + a_list[6:]

此外,您的代码中还有一个错误。 < 4应该是第4行的<= 4

此方法的优点是,只要它是支持切片和加法的序列,它就可以工作。

>>> remove_item_045('0123456')
'1236'
>>> remove_item_045(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
['b', 'c', 'd', 'g']
>>> remove_item_045(('a', 'b', 'c', 'd', 'e', 'f', 'g'))
('b', 'c', 'd', 'g')
>>> remove_item_045(b'0123456')
b'12367'

答案 3 :(得分:0)

您可以使用运算符itemgetter()

from operator import itemgetter
from itertools import chain

l = list(range(10))

ig = itemgetter(slice(1, 4), slice(6, None))
list(chain.from_iterable(ig(l)))
# [1, 2, 3, 6, 7, 8, 9]