特定の質問に答えるのにかかる時間を計算し、答えが間違っているときにwhileループを終了するこのプログラムがありますが、最後の計算を削除したいので、min()
を呼び出すことができ、間違った時間ではありませんこれがわかりにくい場合。
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))
質問を正しく理解できた場合は、スライス表記を使用して、最後のアイテム以外のすべてを保持できます。
record = record[:-1]
しかし、より良い方法はアイテムを直接削除することです:
del record[-1]
注1:record = record [:-1]を使用しても実際には最後の要素は削除されず、サブリストがrecordに割り当てられることに注意してください。関数内で実行し、レコードがパラメーターである場合、これにより違いが生じます。 record = record [:-1]を使用すると、元のリスト(関数の外側)は変更されず、del record [-1]またはrecord.pop()を使用するとリストが変更されます。 (コメントで@pltrdyが述べたように)
注2:コードでは、いくつかのPythonイディオムを使用できます。これを読むことを強くお勧めします。
Pythonistaのようなコード:Idiomatic Python (ウェイバックマシンアーカイブ経由)。
これを使うべきです
del record[-1]
の問題
record = record[:-1]
アイテムを削除するたびにリストのコピーが作成されるため、あまり効率的ではありません
list.pop()
は、リストの最後の要素を削除して返します。
必要なもの:
record = record[:-1]
for
ループの前。
これにより、record
が現在のrecord
リストに設定されますが、without最後の項目になります。必要に応じて、これを行う前にリストが空でないことを確認したい場合があります。
タイミングをよくやるなら、この小さな(20行)コンテキストマネージャーをお勧めします。
コードは次のようになります。
#!/usr/bin/env python
# coding: utf-8
from timer import Timer
if __== '__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]
参考のために、 タイマー コンテキストマネージャーの内容を以下に示します。
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
リストのリストがある場合(tracked_output_sheet)、各リストから最後の要素を削除する場合、次のコードを使用できます。
interim = []
for x in tracked_output_sheet:interim.append(x[:-1])
tracked_output_sheet= interim