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