सूची कैसे खाली करें?


356

ऐसा लगता है कि "गंदा" इस तरह से एक सूची को खाली कर रहा है:

while len(alist) > 0 : alist.pop()

क्या ऐसा करने के लिए एक स्पष्ट तरीका मौजूद है?


28
तो क्यों अजगर dicts और सेट एक स्पष्ट () विधि है, लेकिन सूची नहीं है?
नौकरी

13
लेकिन अगर ऑब्जेक्ट के कई संदर्भ हैं, तो यह उपयोगी हो सकता है।
नेड डीली सेप

3
यह उपयोगी हो सकता है अगर मुझे रन समय में प्रक्रियाओं पर एक साझा सूची को साफ़ करने की आवश्यकता है और गारबेजिंग के लिए प्रतीक्षा करने की आवश्यकता नहीं है (या क्या मैं गलत हूं? क्या मैंने कचरा संग्रह को गलत समझा है?)। इसके अलावा अगर मैं प्रत्येक पोप वाले तत्व को जांचना चाहता हूं तो मैं इसे डिबग कर सकता हूं जबकि मैं स्लाइसिंग (या मैं गलत हूं) का उपयोग नहीं कर सकता। मुझे अपनी सूची साफ़ करते समय प्रक्रिया निष्पादन को रोकने की आवश्यकता नहीं है।
DrFalk3n

2
@ S.Lott सिर्फ इसलिए कि आप यह नहीं समझते कि यह महत्वपूर्ण क्यों है इसका मतलब यह नहीं है कि हम में से बाकी नहीं करते हैं। यदि कई ऑब्जेक्ट एक सामान्य सूची पर निर्भर करते हैं तो यह मायने रखेगा। कई डिजाइन पैटर्न में यह महत्वपूर्ण है। कचरा संग्रहकर्ता का मतलब है कि आपको अपने आप को साफ करने की जरूरत नहीं है; यह अधिक गड़बड़ करने का लाइसेंस नहीं है।
UpAndAdam

4
किसी भी अन्य, बेहतर जवाब के बावजूद, आपका प्रारंभिक कोड लिखा जा सकता था: जबकि alist: alist.pop ()
MrWonderful

जवाबों:


570

यह वास्तव में सूची से सामग्री को हटा देता है, लेकिन पुराने लेबल को नई खाली सूची से प्रतिस्थापित नहीं करता है:

del lst[:]

यहाँ एक उदाहरण है:

lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)

पूर्णता के लिए, स्लाइस असाइनमेंट का एक ही प्रभाव है:

lst[:] = []

यह एक ही समय में एक भाग को प्रतिस्थापित करते समय सूची के एक हिस्से को छोटा करने के लिए भी इस्तेमाल किया जा सकता है (लेकिन यह प्रश्न के दायरे से बाहर है)।

ध्यान दें कि करना lst = []सूची को खाली नहीं करता है, बस एक नई वस्तु बनाता है और इसे चर में बांधता है lst, लेकिन पुरानी सूची में अभी भी समान तत्व होंगे, और प्रभाव स्पष्ट होगा यदि इसमें अन्य चर बाइंडिंग थे।


3
दो और प्रश्न: "डेल" वास्तव में क्या है? (मैं इसे डेल-एटेस चीजें घटाता हूं, लेकिन मुझे वास्तव में पता नहीं है कि यह क्या है) और दूसरा: आप कैसे पढ़ते हैं (ज़ोर से) [:]
ऑस्कररेज़

2
डेल की ध्वनि की व्याख्या के लिए, मैं डॉक्स को संदर्भित करूंगा
फोरट्रान

14
मैं आमतौर पर ज़ोर से अजगर कोड एक्सडी नहीं पढ़ता हूं, लेकिन अगर मुझे लगता है कि मुझे लगता है कि मैं "सूची से अंत तक भीख मांगने के लिए टुकड़ा" कहूंगा।
फोरट्रान

2
@jellybean पूरी तरह से अनपेक्षित रूप से ^ _ ^ अंग्रेजी मेरी मातृभाषा नहीं है, इसलिए मैंने वास्तव में दो टिप्पणियों के बीच विपरीत नहीं देखा।
फोरट्रान

यदि हम l = [] पुरानी सूची की सामग्री को पायथन जीसी द्वारा एकत्र कचरा नहीं मिलेगा?
एलेक्स पुन्नेन

168

आप अजगर 3.3 या बेहतर चला रहे हैं, तो आप उपयोग कर सकते हैं clear()की विधि listहै, जो के समानांतर है clear()की dict, set, dequeऔर अन्य परिवर्तनशील कंटेनर प्रकार:

alist.clear()  # removes all items from alist (equivalent to del alist[:])

लिंक किए गए प्रलेखन पृष्ठ के अनुसार, इसके साथ भी हासिल किया जा सकता है alist *= 0

योग करने के लिए, एक सूची को साफ़ करने के लिए चार बराबर तरीके हैं ( पायथन के ज़ेन के विपरीत )!)

  1. alist.clear() # Python 3.3+
  2. del alist[:]
  3. alist[:] = []
  4. alist *= 0

6
यह जवाब शीर्ष पर होना चाहिए, स्टैकओवरफ्लो के साथ क्या गलत है!
ब्रेकबेडएसपी 5

clear () बेहतर है।
सेलफिश009

61

तुम कोशिश कर सकते हो:

alist[:] = []

जिसका अर्थ है: []स्थान पर सूची (0 तत्व) में विभाजन[:] विभाजन (प्रारंभ से अंत तक सभी अनुक्रमित)

[:] स्लाइस ऑपरेटर है। अधिक जानकारी के लिए यह प्रश्न देखें ।


4
सिर्फ क्यों नहीं alist = []?
मितेनका

16
@mitenka जो सूची को खाली नहीं करता है, वह चर alistको एक अलग सूची के साथ अधिलेखित करता है जो खाली होता है। यदि किसी और के पास मूल सूची का संदर्भ था, तो वह इस प्रकार है (यानी इसमें वह है जो उसमें शुरू करने के लिए था)
एडम बैटकिन

@mitenka एक और कारण है alist.clear()या alist[:] = []यह जाँचने में मदद करता है कि alistवास्तव में एक सूची है। कहो कि तुम alistएक समारोह से लौट आए foo()। आपने सोचा था कि fooएक सूची वापस आ गई है लेकिन वास्तव में यह वापस आ गई है None। का उपयोग alist = []कर उस गलती को पकड़ नहीं सकता।
आफुलेई

32

यह पता चला है कि अजगर 2.5.2 के साथ, 1.1 usec del l[:]की तुलना में थोड़ा धीमा है l[:] = []

$ python -mtimeit "l=list(range(1000))" "b=l[:];del b[:]"
10000 loops, best of 3: 29.8 usec per loop
$ python -mtimeit "l=list(range(1000))" "b=l[:];b[:] = []"
10000 loops, best of 3: 28.7 usec per loop
$ python -V
Python 2.5.2

1
पायथन 2.7.2 में, मेरी मशीन पर, वे उसी के बारे में हैं। वे दोनों प्रति पाश 13.5-13.7 usec से चलते हैं।
लेटनाइट्सडेड

आपको "b [:] = []" और "डेल b [:]" की गणना करने के लिए python3 -mtimeit "l = list (श्रेणी (1000))" "b = l [:]" को भी मापना चाहिए। करो और
लोल

1
मैंने पायथन 3.5 के साथ बेंचमार्क किया और मैं लेटनाइटशेड से सहमत हूं। .clear(), del b[:]और b[:]=[]सभी एक समान होते हैं ( b[:]=[]थोड़ा धीमे होने के कारण।
Conchylicultor

5
lst *= 0

के रूप में एक ही प्रभाव है

lst[:] = []

यह थोड़ा सरल है और शायद याद रखना आसान है। इसके अलावा वहाँ कहने के लिए बहुत कुछ नहीं है

दक्षता उसी के बारे में लगती है


1
पूर्णता के लिए यह ध्यान देने योग्य है, कि किसी भी पूर्णांक जो कि उससे कम या बराबर 0है, का समान प्रभाव होगा। यह एक बहुत साफ-सुथरी चाल है, हालांकि मैं थोड़ा दुखी हूं, कि इस पर ज्यादा ध्यान नहीं गया ..
पीटर वरो

-1
list = []

listएक खाली सूची में रीसेट हो जाएगा ।

ध्यान दें कि आपको आम तौर पर आरक्षित नाम को छाया नहीं देना चाहिए, जैसे कि list, जो किसी सूची ऑब्जेक्ट के लिए निर्माता है - आप उदाहरण के लिए lstया list_इसके बजाय उपयोग कर सकते हैं ।


38
नहीं: यह सूची को संशोधित नहीं करेगा, यह बस चर को एक खाली सूची प्रदान करता है list। यदि आपको किसी फ़ंक्शन को सूची में (उदाहरण के लिए) संशोधित करने की उम्मीद है, तो यह वह नहीं करेगा जो आप चाहते हैं।
एडम बैटनकिन 9'09

10
ज़रुरी नहीं। सवाल यह है कि "एक सूची को कैसे खाली करें" "नहीं" एक चर पर कैसे असाइन किया जाए जिसमें एक सूची शामिल है "
एडम बैटकिन

6
सवाल अस्पष्ट नहीं था, ऑप्स स्निपेट तत्वों को सूची से बाहर कर रहा था (यह वह है, जो इसे जगह में संशोधित करता है) ...
फोरट्रान

7
इसके अलावा, "सूची" को एक चर नाम के रूप में उपयोग नहीं किया जाना चाहिए, क्योंकि "सूची" प्रकार की छाया है। कई पायथन डेवलपर्स एक सूची चर नाम के रूप में "L" का उपयोग करते हैं, लेकिन मैं "lst" पसंद करता हूं।
स्टेव

1
कभी-कभी आप केवल सूची को खाली करना चाहते हैं और यह प्रस्तावित विधियों में से किसी के रूप में अच्छा है। संभवतः और भी तेज़
smac89

-3

एक और सरल कोड जिसका आप उपयोग कर सकते हैं (आपकी स्थिति के आधार पर) यह है:

index=len(list)-1

while index>=0:
    del list[index]
    index-=1

आपको सूची की लंबाई पर इंडेक्स शुरू करना होगा और 0 से आगे की ओर बनाम इंडेक्स पर जाना होगा, क्योंकि इससे आप सूची की लंबाई के बराबर इंडेक्स के साथ समाप्त हो जाएंगे, जबकि यह केवल आधे में कट जाएगा।

इसके अलावा, सुनिश्चित करें कि जबकि लाइन में "साइन से अधिक या बराबर" है। इसे छोड़ना आपको सूची [0] के साथ छोड़ देगा।


15
एक घन के साथ पहिया को
मजबूत करना

Haha। यह दूसरा अजीब उत्तर (+ एक उपयुक्त टिप्पणी) है जो मैंने एसओ पर सामना किया है। इन यादगार चीजों के लिए एक साइट होनी चाहिए: D
akinuri
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.