Listedeki son öğe nasıl silinir?


148

Belirli bir soruyu cevaplamak için harcanan zamanı hesaplayan ve cevap yanlış olduğunda while döngüsünün sonlandırılan bu program var, ama ben son hesaplama silmek istiyorum, bu yüzden arayabilir min()ve yanlış zaman değil, üzgünüm eğer bu kafa karıştırıyor.

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

Yanıtlar:


233

Soruyu doğru anladıysam, son öğe hariç her şeyi tutmak için dilimleme gösterimini kullanabilirsiniz:

record = record[:-1]

Ancak daha iyi bir yol, öğeyi doğrudan silmektir:

del record[-1]

Not 1: record = record [: - 1] kullanmanın son öğeyi gerçekten kaldırmayacağını, ancak alt listeyi kayda atayacağını unutmayın. Bir işlev içinde çalıştırırsanız ve kayıt bir parametredirse, bu bir fark yaratır. Record = record [: - 1] ile orijinal liste (işlevin dışında) değişmez, del record [-1] veya record.pop () ile liste değiştirilir. (yorumlarda @pltrdy tarafından belirtildiği gibi)

Not 2: Kod bazı Python deyimlerini kullanabilir. Bunu okumanızı şiddetle tavsiye ederim:
Pythonista Gibi Kod: Deyimsel Python (geri dönüş makinesi arşivi aracılığıyla).


1
Harika bağlantı, arka cebimde tutacağım.
SethMMorton

del kaydı [-1] yan etkileri vardır. Bu kötü bir tasarımdır ve mümkünse kaçınılmalıdır.
Longurimont

149

bunu kullanmalısın

del record[-1]

İle ilgili sorun

record = record[:-1]

Bir öğeyi her kaldırışınızda listenin bir kopyasını oluşturuyor mu, bu yüzden çok verimli değil


7
Bu, kabul edilen cevaptan daha iyi bir çözümdür.
Geoff Lentsch


9

Gerekenler:

record = record[:-1]

fordöngüden önce .

Bu record, geçerli recordlisteye ayarlanır , ancak son öğe olmadan . İhtiyaçlarınıza bağlı olarak, bunu yapmadan önce listenin boş olmadığından emin olmak isteyebilirsiniz.


3
Ayrıca kullanabilir misiniz record.pop()? (Not: Python için çok
yeniyim

2
Evet, record.pop () öğesini de kullanabilirsiniz. Bkz. Docs.python.org/3.3/tutorial/datastructures.html
sebastian

2
@CodeBeard, sen verebilir kullanmak popama sadece uzağa öğeyi atmak istiyorsanız bu gerçekten gerekli değil.
paxdiablo

2
Emin olduğunuz olun değil kaydına pop tarafından döndürülen değeri () atayarak. Aksi takdirde listenin son değerini kayıtta saklıyorsunuz.
sebastian

1
@paxdiablo ve Bastiano9 - teşekkürler - dönüşü kullanmama konusunda performans etkisi var mı?
CodeBeard

3

Zamanlama ile çok şey yaparsanız, bu küçük (20 satır) içerik yöneticisini önerebilirim:

Kodunuz şöyle görünebilir:

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

Sadece referans olarak, burada Timer içerik yöneticisinin içeriği tam olarak verilmiştir:

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

Aslında bu yazdığım ilk 'zaman' programı, ama modüle biraz daha aşina olduğumda, ona bir göz atacağım, teşekkür ederim!
Samir

3

sadece list.pop() başka bir şekilde kullanmak istiyorsanız şimdi kullanın:list.popleft()


1

Her listeden son öğeyi silmek istediğiniz listeleriniz varsa ( benim durumumda tracked_output_sheet ), aşağıdaki kodu kullanabilirsiniz:

interim = []
for x in tracked_output_sheet:interim.append(x[:-1])
tracked_output_sheet= interim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.