सूची में अंतिम आइटम कैसे हटाएं?


148

मेरे पास यह कार्यक्रम है जो किसी विशिष्ट प्रश्न का उत्तर देने में लगने वाले समय की गणना करता है, और उत्तर गलत होने पर लूप से बाहर निकलता है, लेकिन मैं अंतिम गणना को हटाना चाहता हूं, इसलिए मैं कॉल कर सकता हूं 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] वास्तव में अंतिम तत्व को नहीं हटाता है, लेकिन रिकॉर्ड करने के लिए सबलिस्ट को असाइन करें। इससे कोई फर्क पड़ता है यदि आप इसे किसी फ़ंक्शन के अंदर चलाते हैं और रिकॉर्ड एक पैरामीटर है। रिकॉर्ड के साथ = रिकॉर्ड [: - 1] मूल सूची (फ़ंक्शन के बाहर) अपरिवर्तित है, डेल रिकॉर्ड [-1] या रिकॉर्ड के साथ () सूची में बदलाव किया गया है। (टिप्पणियों में @pltrdy द्वारा कहा गया है)

नोट 2: कोड कुछ पायथन मुहावरों का उपयोग कर सकता है। मैं इसे पढ़ने की अत्यधिक सलाह देता हूं:
कोड लाइक ए पाइथोनिस्टा: आइडोमैटिक पायथन ( वेसबैक मशीन आर्काइव के माध्यम से)।


1
बहुत बढ़िया लिंक, मैं इसे अपनी पिछली जेब में रखूंगा।
सेठमॉर्टन

डेल रिकॉर्ड [-1] के दुष्प्रभाव हैं। यह एक बुरा डिज़ाइन है और यदि संभव हो तो इससे बचना चाहिए।
लोंगुरिमोंट

149

आपको इसका उपयोग करना चाहिए

del record[-1]

के साथ समस्या

record = record[:-1]

क्या यह किसी आइटम को हटाने पर हर बार सूची की एक प्रतिलिपि बनाता है, इसलिए बहुत कुशल नहीं है


7
यह स्वीकृत उत्तर की तुलना में बेहतर समाधान है।
ज्योफ लेन्स्च


9

आप की जरूरत है:

record = record[:-1]

forपाश से पहले ।

यह recordवर्तमान recordसूची में सेट होगा लेकिन अंतिम आइटम के बिना । अपनी आवश्यकताओं के आधार पर, आप यह सुनिश्चित करना चाहते हैं कि ऐसा करने से पहले सूची खाली न हो।


3
क्या आप भी इस्तेमाल कर सकते हैं record.pop()? (एनबी: मैं अजगर के लिए बहुत नया हूं)
कोडबर्ड

2
हां, आप record.pop () का भी उपयोग कर सकते हैं। Docs.python.org/3.3/tutorial/datastructures.html
sebastian

2
@CodeBeard, आप उपयोग कर सकते हैं popलेकिन यह वास्तव में आवश्यक नहीं है यदि आप केवल आइटम को फेंकना चाहते हैं।
paxdiablo

2
सुनिश्चित करें कि आप रिकॉर्ड द्वारा पॉप () द्वारा लौटाए गए मान को असाइन नहीं कर रहे हैं । अन्यथा आप रिकॉर्ड में सूची के अंतिम मूल्य को संग्रहीत कर रहे हैं।
सेबस्टियन

1
@paxdiablo और Bastiano9 - धन्यवाद - क्या रिटर्न का उपयोग नहीं करने में प्रदर्शन प्रभाव है?
कोडबर्ड

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

यदि आपके पास सूचियों की सूची है ( मेरे मामले में tracked_output_sheet ), जहां आप प्रत्येक सूची से अंतिम तत्व हटाना चाहते हैं, तो आप निम्नलिखित कोड का उपयोग कर सकते हैं:

interim = []
for x in tracked_output_sheet:interim.append(x[:-1])
tracked_output_sheet= interim
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.