Làm thế nào để xóa mục cuối cùng trong danh sách?


146

Tôi có chương trình này tính toán thời gian cần thiết để trả lời một câu hỏi cụ thể và thoát khỏi vòng lặp while khi câu trả lời không chính xác, nhưng tôi muốn xóa phép tính cuối cùng, vì vậy tôi có thể gọi min()và đó không phải là thời gian sai, xin lỗi nếu Điều này thật khó hiểu.

from time import time

q = input('What do you want to type? ')
a = ' '
record = []
while a != '':
    start = time()
    a = input('Type: ')
    end = time()
    v = end-start
    record.append(v)
    if a == q:
        print('Time taken to type name: {:.2f}'.format(v))
    else:
        break
for i in record:
    print('{:.2f} seconds.'.format(i))

Câu trả lời:


230

Nếu tôi hiểu chính xác câu hỏi, bạn có thể sử dụng ký hiệu cắt lát để giữ mọi thứ trừ mục cuối cùng:

record = record[:-1]

Nhưng một cách tốt hơn là xóa mục trực tiếp:

del record[-1]

Lưu ý 1: Lưu ý rằng việc sử dụng record = record [: - 1] không thực sự loại bỏ phần tử cuối cùng, nhưng chỉ định danh sách con để ghi. Điều này tạo ra sự khác biệt nếu bạn chạy nó bên trong một hàm và bản ghi là một tham số. Với record = record [: - 1] danh sách ban đầu (bên ngoài hàm) không thay đổi, với del record [-1] hoặc record.pop () danh sách được thay đổi. (như đã nêu bởi @pltrdy trong các bình luận)

Lưu ý 2: Mã có thể sử dụng một số thành ngữ Python. Tôi đặc biệt khuyên bạn nên đọc phần này:
Code Like a Pythonista: Idiomatic Python (thông qua kho lưu trữ máy wayback).


1
Liên kết tuyệt vời, tôi sẽ giữ nó trong túi sau của tôi.
SethMMorton

del record [-1] có tác dụng phụ. Đây là một thiết kế xấu và nên tránh nếu có thể.
Longurimont

149

bạn nên sử dụng cái này

del record[-1]

Vấn đề với

record = record[:-1]

Có phải nó tạo một bản sao của danh sách mỗi khi bạn xóa một mục, vì vậy không hiệu quả lắm


7
Đây là một giải pháp tốt hơn câu trả lời được chấp nhận.
Geoff Lentsch

106

list.pop() loại bỏ và trả về phần tử cuối cùng của danh sách.


9

Bạn cần:

record = record[:-1]

trước forvòng lặp.

Điều này sẽ được đặt recordvào recorddanh sách hiện tại nhưng không có mục cuối cùng. Bạn có thể, tùy thuộc vào nhu cầu của bạn, muốn đảm bảo danh sách không trống trước khi thực hiện việc này.


3
Bạn cũng có thể sử dụng record.pop()? (NB: Tôi rất mới với python)
CodeBeard

2
Có, bạn cũng có thể sử dụng record.pop (). Xem docs.python.org/3.3/tutorial/datastructures.html
sebastian

2
@CodeBeard, bạn có thể sử dụng popnhưng nó không thực sự cần thiết nếu bạn chỉ muốn ném món đồ đó đi.
paxdiablo

2
Đảm bảo bạn không gán giá trị được trả về bởi pop () để ghi. Nếu không, bạn đang lưu trữ giá trị cuối cùng của danh sách trong hồ sơ.
sebastian

1
@paxdiablo và Bastiano9 - cảm ơn - có ảnh hưởng đến hiệu suất trong việc không sử dụng trả lại không?
CodeBeard

3

Nếu bạn làm rất nhiều với thời gian, tôi có thể đề xuất trình quản lý bối cảnh nhỏ (20 dòng) này:

Mã của bạn có thể trông như thế này sau đó:

#!/usr/bin/env python
# coding: utf-8

from timer import Timer

if __name__ == '__main__':
    a, record = None, []
    while not a == '':
        with Timer() as t: # everything in the block will be timed
            a = input('Type: ')
        record.append(t.elapsed_s)
    # drop the last item (makes a copy of the list):
    record = record[:-1] 
    # or just delete it:
    # del record[-1]

Chỉ để tham khảo, đây là nội dung của trình quản lý bối cảnh Timer đầy đủ:

from timeit import default_timer

class Timer(object):
    """ A timer as a context manager. """

    def __init__(self):
        self.timer = default_timer
        # measures wall clock time, not CPU time!
        # On Unix systems, it corresponds to time.time
        # On Windows systems, it corresponds to time.clock

    def __enter__(self):
        self.start = self.timer() # measure start time
        return self

    def __exit__(self, exc_type, exc_value, exc_traceback):
        self.end = self.timer() # measure end time
        self.elapsed_s = self.end - self.start # elapsed time, in seconds
        self.elapsed_ms = self.elapsed_s * 1000  # elapsed time, in milliseconds

Trên thực tế đây là chương trình "lần đầu tiên" tôi đã viết, nhưng khi tôi quen thuộc hơn với mô-đun, tôi sẽ xem xét nó, cảm ơn bạn!
Samir

3

chỉ cần sử dụng list.pop() ngay bây giờ nếu bạn muốn nó theo cách khác sử dụng:list.popleft()


1

Nếu bạn có một danh sách các danh sách (theo dõiDefput_sheet trong trường hợp của tôi), nơi bạn muốn xóa phần tử cuối cùng khỏi mỗi danh sách, bạn có thể sử dụng mã sau:

interim = []
for x in tracked_output_sheet:interim.append(x[:-1])
tracked_output_sheet= interim
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.