क्या मूल्य द्वारा सूची तत्व को हटाने का एक सरल तरीका है?


942
a = [1, 2, 3, 4]
b = a.index(6)

del a[b]
print(a)

उपरोक्त निम्न त्रुटि दिखाता है:

Traceback (most recent call last):
  File "D:\zjm_code\a.py", line 6, in <module>
    b = a.index(6)
ValueError: list.index(x): x not in list

इसलिए मुझे यह करना होगा:

a = [1, 2, 3, 4]

try:
    b = a.index(6)
    del a[b]
except:
    pass

print(a)

लेकिन क्या ऐसा करने का कोई सरल तरीका नहीं है?


14
आप अपनी सूची में 6 के सूचकांक की गणना करते हैं। लेकिन 6 आपकी सूची में नहीं है ... तो क्या होने वाला है? :)
जोहानस चर्रा

5
इसका किसी सूची में मूल्य हटाने से कोई लेना-देना नहीं है, क्योंकि आपका कोड डेल स्टेटमेंट तक नहीं पहुंचता है। हो सकता है कि आपको इसे फिर से देखना चाहिए "मुझे एक मूल्य का सूचकांक कैसे मिलता है जो किसी सूची में नहीं है। स्पष्ट उत्तर - आप नहीं कर सकते।
डेव किर्बी

57
@ अच्छा, सच में नहीं। वह सूची से किसी आइटम को हटाना चाहता है चाहे वह मौजूद हो या न हो, किसी भी वस्तु के लिए अनुक्रमणिका प्राप्त करना नहीं है। सवाल अच्छी तरह से पूछा गया है।
zबज

बिंदु के बगल में, लेकिन एक नंगे exceptबुरा अभ्यास हैexcept Exceptionकम से कम उपयोग करें ।
वेजेंड्रिया

जवाबों:


1562

किसी सूची में किसी तत्व की पहली घटना को हटाने के लिए, बस उपयोग करें list.remove:

>>> a = ['a', 'b', 'c', 'd']
>>> a.remove('b')
>>> print(a)
['a', 'c', 'd']

मन करें कि यह आपके तत्व की सभी घटनाओं को दूर नहीं करता है। उसके लिए एक सूची समझ का उपयोग करें।

>>> a = [10, 20, 30, 40, 20, 30, 40, 20, 70, 20]
>>> a = [x for x in a if x != 20]
>>> print(a)
[10, 30, 40, 30, 40, 70]

144
तत्व सूची में नहीं है, तो विफल रहता है। :)
ibz

21
@ibz सूची की समझ में नहीं आता, भले ही तत्व सूची में न हो, क्या ऐसा नहीं है?
आइजैक

76
किसी को भी स्किमिंग करने के लिए स्पष्ट करने के लिए, यह इस अर्थ में "विफल" होता है कि यह एक मूल्य-अपवाद को जन्म देता है।
केसी फॉक

10
सूची की समझ सूची संदर्भ को बदल देती है इसलिए यदि कहीं संदर्भ की प्रति है, तो निष्कासन का पालन नहीं किया जाएगा।
सेबेस्टियन

removeयह O (n) की जटिलता क्या है ?
रस्मी रंजन नायक

184

आमतौर पर पायथन एक अपवाद को फेंक देगा यदि आप इसे कुछ ऐसा करने के लिए कहते हैं तो आप ऐसा नहीं कर सकते हैं:

if c in a:
    a.remove(c)

या:

try:
    a.remove(c)
except ValueError:
    pass

एक अपवाद आवश्यक रूप से एक बुरी चीज नहीं है जब तक कि यह एक है जिसकी आप उम्मीद कर रहे हैं और ठीक से संभाल रहे हैं।


9
रोकथाम इलाज से बेहतर है। यदि आप पहले असाधारण स्थितियों (उदाहरण के लिए) की जांच कर सकते हैं, तो आपको चाहिए।
गूसडर

82
जबकि अन्य भाषाओं में यह सही है, पायथन में "अनुमति की तुलना में माफी मांगना आसान है।" docs.python.org/2/glossary.html#term-eafp
डेव वेब

6
@Gusdor: यदि सूची थ्रेड्स के बीच साझा की जाती है, तो चेक के a.remove(c)बावजूद वैसे भी विफल हो सकती है if c in a(चेक के aबाद दूसरे कॉल में संशोधित किया जा सकता है c in aलेकिन a.remove(c)कॉल से पहले )। try/exceptया दौड़ की स्थिति से बचने के लिए ताले का उपयोग किया जा सकता है।
jfs

7
@JFSebastian यदि थ्रेड्स के बीच एक सूची साझा की जाती है और आप महत्वपूर्ण अनुभागों को लागू नहीं कर रहे हैं तो आपको बड़ी समस्याएं हैं।
गसडॉर

4
@Gusdor, Pythonique मुहावरा है कि बिना जाँच के प्रयास करें और अपवाद को पकड़ें यदि ऐसा होता है। यह अधिक कुशल है (दो के बजाय केवल एक लुकअप), भले ही थोड़ा बदसूरत हो
जीत

80

तुम कर सकते हो

a=[1,2,3,4]
if 6 in a:
    a.remove(6)

लेकिन ऊपर 2 बार सूची में 6 को खोजने की आवश्यकता है, इसलिए प्रयास करें सिवाय तेजी से

try:
    a.remove(6)
except:
    pass

55

विचार करें:

a = [1,2,2,3,4,5]

सभी घटनाओं को बाहर निकालने के लिए, आप अजगर में फिल्टर फ़ंक्शन का उपयोग कर सकते हैं। उदाहरण के लिए, ऐसा लगेगा:

a = list(filter(lambda x: x!= 2, a))

इसलिए, यह सभी तत्वों को रखेगा a != 2

केवल एक आइटम का उपयोग करने के लिए

a.remove(2)

आप filter()दूसरे में क्यों लपेटते हैं list()? मैनुअल के अनुसार, यह पहले से ही एक सूची देता है।
ओलाफ डाइटेचेस

8
@OlafDietsche Python 3.x में, यह एक फ़िल्टर ऑब्जेक्ट (2.x में, यह एक सूची देता है) लौटाता है, इसलिए मुझे इसके लिए किसी सूची में "a" डालना है, इसके लिए कोई कार्यक्षमता है।
mathwizurd

17

यहां बताया गया है कि यह कैसे करें (सूची बोध के बिना)

def remove_all(seq, value):
    pos = 0
    for item in seq:
        if item != value:
           seq[pos] = item
           pos += 1
    del seq[pos:]

बहुत चालाक - मुझे वास्तव में यह पसंद है - दुर्भाग्य से यह सबसे लोकप्रिय उत्तर के रूप में अक्षम है। जीआईएल का समाधान वास्तव में विशाल सूचियों के लिए बहुत तेज है, जो आपके द्वारा हटाए जाने की इच्छा के केवल कुछ घटनाओं के साथ है।
लॉरल्ड

1
@Larold सबसे तेज़ तरीका एक अलग प्रश्न होगा। मेरा पैसा सामान्य मामले में सूची की समझ पर है। यह समाधान वास्तव में अच्छा प्रदर्शन करना चाहिए यदि मूल्य इनपुट सूची में अक्सर होता है और सूची समझ का उपयोग नहीं किया जाता है। साइथॉन में Pypy, numpy डेटा आज़माएं। [@ गिल का जवाब O(n*n)अनावश्यक रूप से है (1e6 और 1e12 की तुलना करें - आप बाद वाले को जोखिम में नहीं डालना चाहते हैं)। while 1: L.remove(value)और सीपीथॉन में ValueErrorकुछ valueएस या छोटी सूचियों के साथ अच्छी तरह से काम कर सकते हैं ।
jfs

13

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

a = [0, 1, 1, 0, 1, 2, 1, 3, 1, 4]
while a.count(1) > 0:
    a.remove(1)

आपको मिलेगा [0, 0, 2, 3, 4]


4
while 1 in a:लूप संरचना के रूप में उपयोग क्यों नहीं किया जाता है?
TerminalDilettante

12
यह वह O(n^2)जगह है जहाँ एक समझ होगी O(n)
मैड फिजिसिस्ट

1
बेशक @MadPhysicist सही है, और TerminalDilettante का संस्करण बहुत अधिक पायथोनिक है, भले ही हमें प्रदर्शन की परवाह न हो। 2013 मैं सिर्फ पायथन सीखना शुरू किया गया था और आजकल मैं जो कुछ भी लिखता हूं उससे बहुत शर्मिंदा हूं।
gil

11

एक अन्य संभावना सूची के बजाय एक सेट का उपयोग करना है, यदि कोई सेट आपके आवेदन में लागू होता है।

IE यदि आपका डेटा ऑर्डर नहीं किया गया है, और डुप्लिकेट नहीं है, तो

my_set=set([3,4,2])
my_set.discard(1)

त्रुटि रहित है।

अक्सर एक सूची केवल उन वस्तुओं के लिए एक उपयोगी कंटेनर है जो वास्तव में अनियंत्रित हैं। किसी सूची से किसी तत्व की सभी घटनाओं को हटाने का तरीका पूछने वाले प्रश्न हैं। यदि आप पहली बार में ठगी नहीं करना चाहते हैं, तो एक बार फिर एक सेट हाथ में है।

my_set.add(3)

ऊपर से my_set नहीं बदलता है।


10

जैसा कि कई अन्य उत्तरों द्वारा कहा गया है, list.remove()काम करेगा, लेकिन ValueErrorयदि आइटम सूची में नहीं था, तो उसे फेंक दें । अजगर 3.4+ के साथ, इसे दबाने के संदर्भ में एक दिलचस्प तरीका है, दमन प्रसंग का उपयोग करते हुए :

from contextlib import suppress
with suppress(ValueError):
    a.remove('b')

8

किसी सूची में एक मान ढूँढना और फिर उस सूची को हटाना (यदि यह मौजूद है) तो सूची को हटाने की विधि का उपयोग करके आसान किया जाता है:

>>> a = [1, 2, 3, 4]
>>> try:
...   a.remove(6)
... except ValueError:
...   pass
... 
>>> print a
[1, 2, 3, 4]
>>> try:
...   a.remove(3)
... except ValueError:
...   pass
... 
>>> print a
[1, 2, 4]

यदि आप अक्सर ऐसा करते हैं, तो आप इसे एक समारोह में लपेट सकते हैं:

def remove_if_exists(L, value):
  try:
    L.remove(value)
  except ValueError:
    pass

8

यह उदाहरण तेज है और सूची से मूल्य के सभी उदाहरणों को हटा देगा:

a = [1,2,3,1,2,3,4]
while True:
    try:
        a.remove(3)
    except:
        break
print a
>>> [1, 2, 1, 2, 4]

2
यदि आप ऐसा करते हैं, तो आपको वास्तव में केवल breakपर होना चाहिए except ValueError
एंथन जूल


7

यदि आपके तत्व अलग हैं, तो एक साधारण सेट अंतर करेगा।

c = [1,2,3,4,'x',8,6,7,'x',9,'x']
z = list(set(c) - set(['x']))
print z
[1, 2, 3, 4, 6, 7, 8, 9]

2
यदि आपके तत्व अलग हैं और आप आदेश की परवाह नहीं करते हैं
टॉम ज़िक

2

हम भी उपयोग कर सकते हैं।

>>> lst = [23,34,54,45]
>>> remove_element = 23
>>> if remove_element in lst:
...     lst.pop(lst.index(remove_element))
... 
23
>>> lst
[34, 54, 45]
>>> 

2

उन सभी चीजों को अनुक्रमित करके सूची को अधिलेखित करें जिन्हें आप हटाना चाहते हैं

>>> s = [5,4,3,2,1]
>>> s[0:2] + s[3:]
[5, 4, 2, 1]

2

एक पाश और एक शर्त के साथ:

def cleaner(seq, value):    
    temp = []                      
    for number in seq:
        if number != value:
            temp.append(number)
    return temp

और यदि आप कुछ हटाना चाहते हैं, लेकिन सभी नहीं:

def cleaner(seq, value, occ):
    temp = []
    for number in seq:
        if number == value and occ:
            occ -= 1
            continue
        else:
            temp.append(number)
    return temp


1

उदाहरण के लिए कहें, हम सभी को x से हटाना चाहते हैं। यह है कि मैं इसके बारे में कैसे जाना होगा:

x = [1, 2, 3, 1, 2, 3]

अब, यह मेरी विधि का एक व्यावहारिक उपयोग है:

def Function(List, Unwanted):
    [List.remove(Unwanted) for Item in range(List.count(Unwanted))]
    return List
x = Function(x, 1)
print(x)

और यह एक लाइन में मेरी विधि है:

[x.remove(1) for Item in range(x.count(1))]
print(x)

दोनों इसे एक आउटपुट के रूप में प्राप्त करते हैं:

[2, 3, 2, 3, 2, 3]

उम्मीद है की यह मदद करेगा। पुनश्च, यह ध्यान दें कि यह संस्करण 3.6.2 में लिखा गया था, इसलिए आपको इसे पुराने संस्करणों के लिए समायोजित करने की आवश्यकता हो सकती है।


1

हो सकता है कि आपके समाधान ints के साथ काम करते हैं, लेकिन यह शब्दकोश के साथ मेरे लिए काम नहीं करता है।

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

दूसरी ओर, 'डेल' ने भी ठीक से काम नहीं किया है। मेरे मामले में, अजगर 3.6 का उपयोग करना: जब मैं 'डेल' के साथ 'डेल' कमांड में एक सूची से एक तत्व को हटाने की कोशिश करता हूं, तो अजगर प्रक्रिया में सूचकांक को बदलता है और समय से पहले ही परमाणु बंद हो जाता है। यह केवल तभी काम करता है जब आप उल्टे क्रम में तत्व से तत्व को हटाते हैं । इस तरह से जब आप इसके माध्यम से जा रहे हैं, तो आप लंबित तत्वों के सरणी सूचकांक को न बदलें

तब, Im इस्तेमाल किया:

c = len(list)-1
for element in (reversed(list)):
    if condition(element):
        del list[c]
    c -= 1
print(list)

जहाँ 'सूची' [['' की 1 ': मान 1'}, {'की 2': मान 2}, {'की 3': मान 3}, ...] जैसी है।

इसके अलावा आप enumerate का उपयोग करके अधिक पायथोनिक कर सकते हैं:

for i, element in enumerate(reversed(list)):
    if condition(element):
        del list[(i+1)*-1]
print(list)

0
arr = [1, 1, 3, 4, 5, 2, 4, 3]

# to remove first occurence of that element, suppose 3 in this example
arr.remove(3)

# to remove all occurences of that element, again suppose 3
# use something called list comprehension
new_arr = [element for element in arr if element!=3]

# if you want to delete a position use "pop" function, suppose 
# position 4 
# the pop function also returns a value
removed_element = arr.pop(4)

# u can also use "del" to delete a position
del arr[4]

0

यह "-v"सरणी से सभी आवृत्तियों को निकालता है sys.argv, और यदि कोई उदाहरण नहीं मिला, तो शिकायत न करें:

while "-v" in sys.argv:
    sys.argv.remove('-v')

आप एक फ़ाइल नामक कोड को क्रिया में देख सकते हैं speechToText.py:

$ python speechToText.py -v
['speechToText.py']

$ python speechToText.py -x
['speechToText.py', '-x']

$ python speechToText.py -v -v
['speechToText.py']

$ python speechToText.py -v -v -x
['speechToText.py', '-x']

-1

यह मेरा जवाब है, बस जबकि और के लिए उपयोग करें

def remove_all(data, value):
    i = j = 0
    while j < len(data):
        if data[j] == value:
            j += 1
            continue
        data[i] = data[j]
        i += 1
        j += 1
    for x in range(j - i):
        data.pop()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.