วิธีลบรายการสุดท้ายในรายการ?


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: โปรดทราบว่าการใช้บันทึก = บันทึก [: - 1] ไม่ได้ลบองค์ประกอบสุดท้ายจริงๆ แต่กำหนดรายการย่อยที่จะบันทึก สิ่งนี้สร้างความแตกต่างถ้าคุณเรียกใช้ภายในฟังก์ชันและบันทึกเป็นพารามิเตอร์ ด้วย record = record [: - 1] รายการดั้งเดิม (นอกฟังก์ชั่น) จะไม่เปลี่ยนแปลงโดยมีการบันทึก del [-1] หรือ record.pop () รายการจะถูกเปลี่ยน (ตามที่ระบุโดย @pltrdy ในความคิดเห็น)

หมายเหตุ 2: รหัสสามารถใช้สำนวน Python ได้ ฉันขอแนะนำให้อ่านนี้:
รหัสเหมือน Pythonista: Idiomatic Python (ผ่านการเก็บถาวรของเครื่อง wayback)


1
ลิงก์สุดยอดฉันจะเก็บไว้ในกระเป๋าหลังของฉัน
SethMMorton

del record [-1] มีผลข้างเคียง นี่คือการออกแบบที่ไม่ดีและควรหลีกเลี่ยงถ้าเป็นไปได้
Longurimont

149

คุณควรใช้สิ่งนี้

del record[-1]

มีปัญหากับ

record = record[:-1]

คือมันทำสำเนารายการทุกครั้งที่คุณลบรายการจึงไม่มีประสิทธิภาพมาก


7
นี่เป็นทางออกที่ดีกว่าคำตอบที่ยอมรับ
Geoff Lentsch


9

คุณต้องการ:

record = record[:-1]

ก่อนที่จะforห่วง

สิ่งนี้จะตั้งค่าrecordเป็นrecordรายการปัจจุบันแต่ไม่มีรายการสุดท้าย คุณอาจต้องการตรวจสอบให้แน่ใจว่ารายการไม่ว่างเปล่าทั้งนี้ขึ้นอยู่กับความต้องการของคุณก่อนที่จะทำสิ่งนี้


3
คุณสามารถใช้record.pop()หรือไม่ (หมายเหตุ: ฉันใหม่กับงูใหญ่)
CodeBeard

2
ใช่คุณสามารถใช้ record.pop () ดูdocs.python.org/3.3/tutorial/datastructures.html
sebastian

2
@CodeBeard คุณสามารถใช้popแต่ไม่จำเป็นจริงๆถ้าคุณเพียงแค่ต้องการทิ้งรายการ
paxdiablo

2
ตรวจสอบให้แน่ใจว่าคุณไม่ได้กำหนดค่าที่ส่งคืนโดยป๊อป () เพื่อบันทึก มิฉะนั้นคุณจะเก็บค่าสุดท้ายของรายการไว้ในบันทึก
เซบาสเตียน

1
@paxdiablo และ Bastiano9 - ขอบคุณ - มีผลกระทบต่อประสิทธิภาพในการไม่ใช้ผลตอบแทนหรือไม่?
CodeBeard

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]

เพื่อการอ้างอิงนี่คือเนื้อหาของตัวจัดการบริบทตัวจับเวลาเต็ม:

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

อันที่จริงนี่เป็นโปรแกรม 'เวลา' ครั้งแรกที่ฉันเขียน แต่เมื่อฉันคุ้นเคยกับโมดูลเพิ่มขึ้นเล็กน้อยฉันจะลองดูสิขอบคุณมาก!
กลั้ว


1

หากคุณมีรายการรายการ ( ติดตาม _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.