Bagaimana cara menghapus item terakhir dalam daftar?


148

Saya memiliki program ini yang menghitung waktu yang diperlukan untuk menjawab pertanyaan tertentu, dan keluar dari loop sementara ketika jawaban salah, tetapi saya ingin menghapus perhitungan terakhir, jadi saya dapat memanggil min()dan itu bukan waktu yang salah, maaf jika ini membingungkan.

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))

Jawaban:


233

Jika saya memahami pertanyaan dengan benar, Anda dapat menggunakan notasi slicing untuk menyimpan semuanya kecuali item terakhir:

record = record[:-1]

Tetapi cara yang lebih baik adalah menghapus item secara langsung:

del record[-1]

Catatan 1: Perhatikan bahwa menggunakan record = record [: - 1] tidak benar-benar menghapus elemen terakhir, tetapi menetapkan sublist untuk direkam. Ini membuat perbedaan jika Anda menjalankannya di dalam fungsi dan catatan adalah parameter. Dengan record = record [: - 1] daftar asli (di luar fungsi) tidak berubah, dengan del record [-1] atau record.pop () daftar diubah. (seperti yang dinyatakan oleh @pltrdy di komentar)

Catatan 2: Kode ini dapat menggunakan beberapa idiom Python. Saya sangat merekomendasikan membaca ini:
Code Like a Pythonista: Idiomatic Python (via wayback machine arsip).


1
Tautan yang luar biasa, saya akan menyimpannya di saku belakang saya.
SethMMorton

catatan del [-1] memiliki efek samping. Ini adalah desain yang buruk dan harus dihindari jika memungkinkan.
Longurimont

149

Anda harus menggunakan ini

del record[-1]

Masalah dengan

record = record[:-1]

Apakah itu membuat salinan daftar setiap kali Anda menghapus item, jadi tidak sangat efisien


7
Ini adalah solusi yang lebih baik daripada jawaban yang diterima.
Geoff Lentsch

107

list.pop() menghapus dan mengembalikan elemen terakhir dari daftar.


9

Anda membutuhkan:

record = record[:-1]

sebelum forloop.

Ini akan diatur recordke recorddaftar saat ini tetapi tanpa item terakhir. Anda dapat, tergantung pada kebutuhan Anda, ingin memastikan daftar tersebut tidak kosong sebelum melakukan ini.


3
Bisakah Anda juga menggunakan record.pop()? (NB: Saya sangat baru untuk python)
CodeBeard

2
Ya, Anda juga bisa menggunakan record.pop (). Lihat docs.python.org/3.3/tutorial/datastructures.html
sebastian

2
@ CodeBeard, Anda bisa menggunakan poptetapi itu tidak benar-benar diperlukan jika Anda hanya ingin membuang barang itu.
paxdiablo

2
Pastikan kamu tidak menetapkan nilai yang dikembalikan oleh pop () untuk direkam. Kalau tidak, Anda menyimpan nilai terakhir daftar dalam catatan.
sebastian

1
@paxdiablo dan Bastiano9 - terima kasih - apakah ada dampak kinerja dalam tidak menggunakan pengembalian?
CodeBeard

3

Jika Anda melakukan banyak hal dengan pengaturan waktu, saya dapat merekomendasikan manajer konteks kecil (20 baris) ini:

Kode Anda dapat terlihat seperti ini:

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

Hanya untuk referensi, inilah isi dari Timer pengelola konteks secara penuh:

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

Sebenarnya ini adalah program 'kali' pertama yang saya tulis, tetapi ketika saya menjadi sedikit lebih terbiasa dengan modul, saya akan memeriksanya, terima kasih!
Samir

3

cukup gunakan list.pop() sekarang jika Anda ingin menggunakan cara lain:list.popleft()


1

Jika Anda memiliki daftar daftar ( tracked_output_sheet dalam kasus saya), tempat Anda ingin menghapus elemen terakhir dari setiap daftar, Anda dapat menggunakan kode berikut:

interim = []
for x in tracked_output_sheet:interim.append(x[:-1])
tracked_output_sheet= interim
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.