リストの最後のアイテムを削除する方法は?


148

特定の質問に答えるのにかかる時間を計算し、答えが正しくない場合に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))

回答:


233

私が質問を正しく理解した場合は、スライス表記を使用して、最後の項目を除くすべてを保持できます。

record = record[:-1]

しかし、より良い方法は、アイテムを直接削除することです:

del record[-1]

注1:record = record [:-1]を使用しても、実際には最後の要素は削除されませんが、サブリストをrecordに割り当てます。これは、関数内で実行し、レコードがパラメーターの場合に違いがあります。record = record [:-1]の場合、元のリスト(関数外)は変更されず、del record [-1]またはrecord.pop()の場合、リストは変更されます。(コメントの@pltrdyで述べられているように)

注2:コードでは、いくつかのPythonイディオムを使用できます。私はこれを読むことを強くお勧め
します:PythonのようなコードイディオマティックPython(ウェイバックマシンアーカイブ経由)。


1
素晴らしいリンクです。バックポケットに入れておきます。
SethMMorton 2013

del record [-1]には副作用があります。これは悪い設計であり、可能であれば回避する必要があります。
Longurimont

149

あなたはこれを使うべきです

del record[-1]

の問題

record = record[:-1]

アイテムを削除するたびにリストのコピーを作成するので、あまり効率的ではありません


7
これは、受け入れられた回答よりも優れたソリューションです。
Geoff Lentsch 2017


9

必要なもの:

record = record[:-1]

forループの前。

これはrecord現在のrecordリストに設定されますが、最後のアイテムはありません。これを行う前に、必要に応じて、リストが空でないことを確認したい場合があります。


3
あなたも使用できますrecord.pop()か?(注:私はPythonが
初めてです

2
はい、record.pop()を使用することもできます。docs.python.org/3.3/tutorial/datastructures.htmlを
sebastian

2
@CodeBeardを使用できますpopが、アイテムを捨てたいだけの場合は、必ずしも必要ではありません。
paxdiablo 2013

2
pop()から返された値を記録に割り当てていないことを確認してください。それ以外の場合は、リストの最後の値をレコードに格納します。
セバスチャン2013

1
@paxdiabloとBastiano9-ありがとう-リターンを使用しないとパフォーマンスに影響がありますか?
CodeBeard 2013

3

タイミングに関して多くのことを行う場合は、この小さな(20行の)コンテキストマネージャをお勧めします。

この場合、コードは次のようになります。

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

参考までに、Timerコンテキストマネージャーのコンテンツ全体を次に示します。

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

実際、これは私が書いた最初の「時間」プログラムですが、モジュールに少し慣れると、そのモジュールを調べてみます。ありがとう!
Samir 2013

3

list.pop() あなたがそれを他の方法で使用したい場合は、単に今使用してください:list.popleft()


1

各リストから最後の要素を削除したいリストのリスト(私の場合はtracked_output_sheet)がある場合は、次のコードを使用できます。

interim = []
for x in tracked_output_sheet:interim.append(x[:-1])
tracked_output_sheet= interim
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.