목록에서 마지막 항목을 삭제하는 방법은 무엇입니까?


147

특정 질문에 대답하는 데 걸리는 시간을 계산하는이 프로그램이 있으며 답변이 틀릴 때 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))

답변:


232

질문을 올바르게 이해했다면 슬라이싱 표기법을 사용하여 마지막 항목을 제외한 모든 것을 유지할 수 있습니다.

record = record[:-1]

그러나 더 좋은 방법은 항목을 직접 삭제하는 것입니다.

del record[-1]

참고 1 : record = record [:-1]을 사용하면 실제로 마지막 요소가 제거되지 않고 레코드에 하위 목록이 할당됩니다. 함수 내에서 실행하고 레코드가 매개 변수 인 경우 차이가 있습니다. record = record [:-1]을 사용하면 원래 목록 (함수 외부)이 변경되지 않고 del record [-1] 또는 record.pop ()을 사용하여 목록이 변경됩니다. (의견에 @pltrdy가 명시한 바와 같이)

참고 2 : 코드는 일부 파이썬 관용구를 사용할 수 있습니다. 나는 이것을 읽는 것이 좋습니다 :
Pythonista와 같은 코드 : 관용 기계 아카이브를 통한 관용적 파이썬 .


1
멋진 링크, 뒷 주머니에 보관하겠습니다.
SethMMorton

del record [-1]에 부작용이 있습니다. 이것은 잘못된 디자인이므로 가능하면 피해야합니다.
Longurimont

149

당신은 이것을 사용해야합니다

del record[-1]

문제

record = record[:-1]

항목을 제거 할 때마다 목록의 사본을 작성하므로 매우 효율적이지 않습니다.


7
이것은 허용되는 답변보다 더 나은 솔루션입니다.
Geoff Lentsch '12


9

당신이 필요합니다 :

record = record[:-1]

for루프 전에 .

record현재 record목록으로 설정 되지만 마지막 항목 은 설정 되지 않습니다 . 필요에 따라이 작업을 수행하기 전에 목록이 비워지지 않도록 할 수 있습니다.


3
당신은 또한 사용할 수 record.pop()있습니까? (NB : 저는 파이썬을
처음 접합니다

2
예, record.pop ()을 사용할 수도 있습니다. docs.python.org/3.3/tutorial/datastructures.html
sebastian

2
@CodeBeard, 사용할 pop있지만 항목을 버리고 싶을 때는 실제로 필요하지 않습니다.
paxdiablo

2
당신이하고 있는지 확인 하지 레코드에 팝업 ()에서 반환 된 값을 할당. 그렇지 않으면 목록의 마지막 값을 레코드에 저장합니다.
sebastian

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

실제로 이것은 내가 작성한 최초의 '시간'프로그램이지만 모듈에 대해 조금 더 익숙해지면 살펴 보겠습니다. 감사합니다!
Samir

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.