如何在 Python 中以不同方式处理列表中的最后一个元素?

Posted

技术标签:

【中文标题】如何在 Python 中以不同方式处理列表中的最后一个元素?【英文标题】:How to treat the last element in list differently in Python? 【发布时间】:2011-01-26 14:40:08 【问题描述】:

我需要对列表中的最后一个元素进行一些特殊操作。 还有比这更好的方法吗?

数组 = [1,2,3,4,5] 对于 i,枚举(数组)中的 val: 如果(i+1)== len(数组): // 处理最后一个元素 别的: // 处理其他元素

【问题讨论】:

Identify which iteration you are on in a loop in python的可能重复 @PaulKenjora 他已经在使用enumerate 在您提供的链接中做几乎相同的事情。他要求一种更好和更pythonic 的方式 来检测最后一个元素,而不是使用他列出的方法。不应被视为重复。 【参考方案1】:
for item in list[:-1]:
    print "Not last: ", item
print "Last: ", list[-1]

如果你不想复制列表,你可以做一个简单的生成器:

# itr is short for "iterable" and can be any sequence, iterator, or generator

def notlast(itr):
    itr = iter(itr)  # ensure we have an iterator
    prev = itr.next()
    for item in itr:
        yield prev
        prev = item

# lst is short for "list" and does not shadow the built-in list()
# 'L' is also commonly used for a random list name
lst = range(4)
for x in notlast(lst):
    print "Not last: ", x
print "Last: ", lst[-1]

notlast 的另一种定义:

import itertools
notlast = lambda lst:itertools.islice(lst, 0, len(lst)-1)

【讨论】:

我建议您不要使用 listiter 作为变量名,因为它们会影响内置函数 我给了你 +1,但你为迭代器案例提供的代码不起作用。我现在就进去修。 第一个 notlast 定义的简单版本: def butlast(xs): prev = xs.next() for x in xs: yield prev prev = x (我还要添加第一行: xs = iter(xs)) 按照 steveha 的示例,我继续编辑了我的建议。我不确定这是否真的是礼貌的做法——希望你不要介意。 @Darius:很高兴你做到了。我不是每天 24 小时都坐在 SO 上,如果 OP 得到最好的答案,那就太好了。【参考方案2】:

如果您的序列不是很长,那么您可以将其切片:

for val in array[:-1]:
  do_something(val)
else:
  do_something_else(array[-1])

【讨论】:

+1 表示“for/else”,但请注意,如果“做某事”代码实际上涉及 break 语句(循环的提前终止),则将跳过 else 代码。在这种情况下是否相关取决于 OP,但应该注意。【参考方案3】:

使用迭代工具

>>> from itertools import repeat, chain,izip
>>> for val,special in izip(array, chain(repeat(False,len(array)-1),[True])):
...     print val, special
... 
1 False
2 False
3 False
4 False
5 True

liori 的答案版本适用于任何可迭代对象(不需要len() 或切片)

def last_flagged(seq):
    seq = iter(seq)
    a = next(seq)
    for b in seq:
        yield a, False
        a = b
    yield a, True        

mylist = [1,2,3,4,5]
for item,is_last in last_flagged(mylist):
    if is_last:
        print "Last: ", item
    else:
        print "Not last: ", item

【讨论】:

对于第一个选项:使用 Python 3 izip 成为内置的 zip,因此请改用它。【参考方案4】:

如果您的逻辑永远不会在循环中使用break,那么for...else 构造可能会起作用:

In [1]: count = 0
   ...: for i in [1, 2, 3]:
   ...:     count +=1
   ...:     print("any item:", i)
   ...: else:
   ...:     if count:
   ...:         print("last item: ", i)
   ...:
any item: 1
any item: 2
any item: 3
last item:  3

您需要count 变量以防可迭代对象为空,否则将不会定义变量i

【讨论】:

【参考方案5】:

if 条件的简单方法:

for item in list:
    print "Not last: ", item
    if list.index(item) == len(list)-1:
        print "Last: ", item

【讨论】:

这很慢,如果列表有重复则不起作用。【参考方案6】:
for i in items:
  if i == items[-1]:
    print 'The last item is: '+i

【讨论】:

这在items = [1,2,1]中的不同元素相同时不起作用 这不是很贵吗? 如果您使用单个变量,当元素多次出现在列表中时,它会起作用

以上是关于如何在 Python 中以不同方式处理列表中的最后一个元素?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中以列表(循环方式)迭代对

如何在列表视图中以不同方式对齐标签

如何在 KDB 中以二进制格式保存列表/矩阵?

在 QTextBrowser 中以不同方式处理不同的链接

Workday - 如何在 Workday 中以编程方式获取 WSDL 列表

如何在简单的 ANTLR 词法分析器中以不同的方式处理 <script> 标签?