是否可以忽略列表的最后一个元素而不必创建另一个列表并且不修改原始列表?

问题描述 投票:0回答:2

我需要在使用for时忽略列表的最后一个元素,而不创建任何其他列表或修改进程上的主列表。

并且不忽略最后一个元素,如果它在任何其他位置重复而不是最后一个元素。所以,只能忽略它的立场。

在这里我忽略了它,但我必须创建一个额外的列表:

list1 = [3,2,3] list1_without_last = list1
list1_without_last.remove(list1_without_last[len(list1_without_last)-1])
for i in list1_without_last :
    #do something

我需要这样的东西:

list1 = [3,2,3] for i in list1 except_list1_last_element:

例1:list3 = [4,5,4,5]输出:[4,5,4]

例2:list4 = [1,2,3,4]输出:[1,2,3]

python python-3.x
2个回答
2
投票

规范的方法是使用range通过索引访问项目。将索引与列表长度进行比较是检查它是最后一个元素的最简单方法。

for i in range(len(some_list) - 1):
    item = some_list[i]

不支持len或索引的迭代器的另一种方法是使用itertools.tee保持迭代器的前瞻副本,并在前瞻到达结束时停止原始操作符的迭代。这也具有直接推广以丢弃最后的n元素的优点。

from itertools import tee, islice

def drop_last(it, n=1):
    it, lookahead = tee(iter(it))
    next(islice(lookahead, n, n), None)
    for _ in lookahead:
        yield next(it)

for x in drop_last([1, 2, 3]):
    print(x)
# output:
# 1
# 2

1
投票

这个怎么样?

list1 = [3, 2, 3]
for i in list1[:-1]:
    print(i)

如果没有创建任何中间副本是一个很难的要求,你可以使用itertools.islice

import itertools
list1 = [3, 2, 3]
for i in itertools.islice(list1, len(list1) - 1)):
    print(i)
© www.soinside.com 2019 - 2024. All rights reserved.