2010-03-11 60 views
36

Tôi cần thực hiện một số thao tác đặc biệt cho phần tử cuối cùng trong danh sách. Có cách nào tốt hơn không?Cách xử lý phần tử cuối cùng trong danh sách khác trong 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 
+1

Có thể có plicate của [Xác định lặp đi lặp lại bạn đang ở trong một vòng trong python] (http://stackoverflow.com/questions/4751092/identify-which-iteration-you-are-on-in-a-loop-in-python) –

Trả lời

48
for item in list[:-1]: 
    print "Not last: ", item 
print "Last: ", list[-1] 

Nếu bạn không muốn thực hiện một bản sao của danh sách, bạn có thể làm cho một máy phát điện đơn giản:

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

Một định nghĩa cho notlast:

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

Tôi khuyên bạn không nên sử dụng 'list' và' iter' làm tên biến khi chúng đổ bóng nội dung dựng sẵn –

+0

Tôi đã cấp cho bạn +1, nhưng mã bạn đã có cho trường hợp trình lặp không hoạt động. Tôi sẽ đi vào và sửa chữa nó ngay bây giờ. – steveha

+0

Một phiên bản đơn giản của định nghĩa đầu tiên của bạn notlast: def butlast (xs): trước = xs.next() cho x trong xs: năng suất trước trước = x (Tôi muốn cũng thêm một đầu tiên line: xs = iter (xs)) –

27

Nếu trình tự của bạn không quá dài, bạn chỉ có thể cắt nó:

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

+1 cho "for/else", nhưng lưu ý rằng nếu mã "làm điều gì đó" thực sự liên quan đến câu lệnh ngắt (kết thúc sớm vòng lặp) thì mã khác sẽ bị bỏ qua. Cho dù đó là có liên quan trong trường hợp này là lên đến OP, nhưng cần lưu ý. –

+2

+1 khác cho 'for/else' –

6

sử dụng 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 

Phiên bản của câu trả lời liori để làm việc trên bất kỳ iterable (không yêu cầu len() hoặc cắt)

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 
-3
for i in items: 
    if i == items[-1]: 
    print 'The last item is: '+i 
+0

Điều này không hoạt động khi các phần tử khác nhau giống như trong 'items = [1,2,1]' –

+1

Điều này không đắt tiền? – IIllIIll

+0

Nó hoạt động khi các phần tử nằm trong danh sách nhiều lần nếu bạn sử dụng một biến duy nhất – HCLivess

-1

Cách đơn giản với một nếu điều kiện:

for item in list: 
    print "Not last: ", item 
    if list.index(item) == len(list)-1: 
     print "Last: ", item 
Các vấn đề liên quan