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

pro*_*eek 49 python

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

array = [1,2,3,4,5] 
for i, val in enumerate(array): 
  if (i+1) == len(array): 
    // Process for the last element 
  else: 
    // Process for the other element 

lio*_*ori 57

for item in list[:-1]:
    print "Not last: ", item
print "Last: ", list[-1]
Run Code Online (Sandbox Code Playgroud)

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

# 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]
Run Code Online (Sandbox Code Playgroud)

notlast的另一个定义:

import itertools
notlast = lambda lst:itertools.islice(lst, 0, len(lst)-1)
Run Code Online (Sandbox Code Playgroud)

  • 我建议你不要使用`list`和`iter`作为变量名,因为它们会影响内置函数 (4认同)

Ign*_*ams 38

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

for val in array[:-1]:
  do_something(val)
else:
  do_something_else(array[-1])
Run Code Online (Sandbox Code Playgroud)

  • +1为"for/else",但请注意,如果"do something"代码实际上涉及break语句(提前终止循环),则将跳过else代码.在这种情况下,这是否与OP相关,但应该注意. (7认同)
  • 'for/else`的另一个+1 (4认同)

Joh*_*ooy 6

使用itertools

>>> 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)