Hoe verwijder ik het laatste item in de lijst?

Ik heb dit programma dat de tijd berekent die nodig is om een ​​specifieke vraag te beantwoorden, en stopt met de while-lus wanneer het antwoord onjuist is, maar ik wil de laatste berekening verwijderen, zodat ik min() en het is niet het verkeerde moment, sorry als dit verwarrend is.

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

Antwoord 1, autoriteit 100%

Als ik de vraag goed heb begrepen, kun je de slicing-notatie gebruiken om alles te behouden behalve het laatste item:

record = record[:-1]

Maar een betere manier is om het item direct te verwijderen:

del record[-1]

Opmerking 1: Merk op dat het gebruik van record = record[:-1] niet echt het laatste element verwijdert, maar de sublijst toewijst aan record. Dit maakt een verschil als u het binnen een functie uitvoert en record een parameter is. Met record = record[:-1] blijft de originele lijst (buiten de functie) ongewijzigd, met del record[-1] of record.pop() wordt de lijst gewijzigd. (zoals aangegeven door @pltrdy in de reacties)

Opmerking 2: De code kan enkele Python-idiomen gebruiken. Ik raad je ten zeerste aan dit te lezen:
Code als leuk a Pythonista: Idiomatic Python (via wayback machine-archief).


Antwoord 2, autoriteit 55%

je zou dit moeten gebruiken

del record[-1]

Het probleem met

record = record[:-1]

Is dat een kopie van de lijst elke keer dat je een item verwijdert, dus niet erg efficiënt


Antwoord 3, autoriteit 43%

list.pop() verwijdert en retourneert het laatste element van de lijst.


Antwoord 4, autoriteit 3%

Je hebt nodig:

record = record[:-1]

vóór de for-lus.

Hiermee wordt record ingesteld op de huidige record lijst, maar zonder het laatste item. U kunt, afhankelijk van uw behoeften, ervoor zorgen dat de lijst niet leeg is voordat u dit doet.


Antwoord 5, autoriteit 3%

gebruik gewoon list.pop()
als je het nu andersom wilt, gebruik dan: list.popleft()


Antwoord 6

Als je veel met timing doet, kan ik deze kleine (20-regelige) contextmanager aanbevelen:

Je code zou er dan zo uit kunnen zien:

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

Ter referentie: hier is de inhoud van de Timer contextmanager volledig:

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

Antwoord 7

U moet *list,_ = list gebruiken zoals in het volgende voorbeeld

record = [1,2,3]
*record,_ = record
record
---
[1, 2]

Antwoord 8

Als je een lijst met lijsten hebt (tracked_output_sheet in mijn geval), waar je het laatste element uit elke lijst wilt verwijderen, kun je de volgende code gebruiken:

interim = []
for x in tracked_output_sheet:interim.append(x[:-1])
tracked_output_sheet= interim

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes