अजगर का उपयोग करके एक सरणी से विशिष्ट तत्व कैसे निकालें


138

मैं कुछ लिखना चाहता हूं जो एक सरणी से एक विशिष्ट तत्व को निकालता है। मुझे पता है कि forसामग्री से मेल खाने वाले तत्व को खोजने के लिए मुझे सरणी के माध्यम से लूप करना होगा।

मान लीजिए कि मेरे पास ईमेल की एक सरणी है और मैं उस तत्व से छुटकारा पाना चाहता हूं जो कुछ ईमेल स्ट्रिंग से मेल खाता है।

मैं वास्तव में लूप संरचना के लिए उपयोग करना चाहता हूं क्योंकि मुझे अन्य सरणियों के लिए भी इसी सूचकांक का उपयोग करने की आवश्यकता है।

यहाँ कोड है जो मेरे पास है:

for index, item in emails:
    if emails[index] == 'something@something.com':
         emails.pop(index)
         otherarray.pop(index)

6
क्या आप ढूंढ रहे हैं list.remove(x)?
जैकब

काफी नहीं। मैं लूप के लिए उपयोग करना चाहूंगा ताकि मैं
लोकोबॉय

4
इस पर पुनरावृत्ति करते समय आपको सूची नहीं बदलनी चाहिए।
जैकब

मुझे ऐसा क्यों नहीं करना चाहिए? यह भी मेरे लिए काम नहीं कर रहा है।
लोकोबॉय

जवाबों:


200

आपको सरणी को पुनरावृत्त करने की आवश्यकता नहीं है। बस:

>>> x = ['ala@ala.com', 'bala@bala.com']
>>> x
['ala@ala.com', 'bala@bala.com']
>>> x.remove('ala@ala.com')
>>> x
['bala@bala.com']

यह स्ट्रिंग से मेल खाने वाली पहली घटना को हटा देगा।

संपादित करें: आपके संपादन के बाद, आपको अभी भी इसे पुन: व्यवस्थित करने की आवश्यकता नहीं है। बस करो:

index = initial_list.index(item1)
del initial_list[index]
del other_list[index]

1
ऊपर देखें कि मैं उसी सूचकांक का पुन: उपयोग करने के लिए लूप के लिए उपयोग करना
चाहूंगा

मेरे उत्तर का संपादन किया। फिर भी लूप की कोई जरूरत नहीं है।
बोगडान

1
आप पहली बार कैसे जाँचते हैं कि आइटम initial_list में मौजूद है? ऐसा कोई मामला हो सकता है जहां यह मौजूद नहीं है और आपको इसे हटाना नहीं होगा।
लोकोबॉय

17

अवांछित मूल्यों को दूर करने के लिए एक साफ सुथरा तरीका इस्तेमाल करना filter()और lambdaप्रदान करना होगा:

newEmails = list(filter(lambda x : x != 'something@something.com', emails))

यह ईमेल को संशोधित नहीं करता है। यह नई सूची newEmails बनाता है जिसमें केवल वे तत्व हैं जिनके लिए अनाम फ़ंक्शन True लौटा है।


5

लूप के लिए आपका सूचकांक सही नहीं है, अगर आपको लूप के उपयोग के लिए सूचकांक की आवश्यकता है:

for index, item in enumerate(emails):
    # whatever (but you can't remove element while iterating)

आपके मामले में, बोगडान समाधान ठीक है, लेकिन आपकी डेटा संरचना पसंद इतनी अच्छी नहीं है। एक ही इंडेक्स में दूसरे से डेटा से संबंधित डेटा के साथ इन दोनों सूचियों को बनाए रखने के लिए अनाड़ी है।

टपल (ईमेल, अन्यता) की सूची बेहतर हो सकती है, या कुंजी के रूप में ईमेल के साथ एक तानाशाही हो सकती है।


4

यह करने के लिए समझदार तरीका उपयोग करना है zip()और एक सूची समझ / जनरेटर अभिव्यक्ति:

filtered = (
    (email, other) 
        for email, other in zip(emails, other_list) 
            if email == 'something@something.com')

new_emails, new_other_list = zip(*filtered)

इसके अलावा, यदि आपका उपयोग नहीं कर रहा है array.array()या नहीं numpy.array(), तो सबसे अधिक संभावना है कि आप उपयोग कर रहे हैं []या list(), जो आपको सूची देता है, न कि अर्रेज़। एक ही बात नहीं है।


1
@ बोगदान के उत्तर की तुलना में कोई भी निश्चित नहीं है कि यह "समझदार" कैसे है, जो बहुत अधिक, बहुत क्लीनर है।
जॉर्डन लैप

इंगित करने के लिए धन्यवाद कि सरणियाँ सूचियों के समान नहीं हैं। चयनित जवाब 2.7 में सरणियों पर काम नहीं करता है।
EL_DON

2

इस समस्या का एक वैकल्पिक समाधान है जो डुप्लिकेट मैचों से भी संबंधित है।

हम समान लंबाई के 2 सूचियों के साथ शुरू: emails, otherarray। उद्देश्य प्रत्येक सूची के लिए दोनों सूचियों से वस्तुओं को निकालना है iजहां emails[i] == 'something@something.com'

यह एक सूची समझ का उपयोग करके प्राप्त किया जा सकता है और फिर इसके माध्यम से विभाजित किया जा सकता है zip:

emails = ['abc@def.com', 'something@something.com', 'ghi@jkl.com']
otherarray = ['some', 'other', 'details']

from operator import itemgetter

res = [(i, j) for i, j in zip(emails, otherarray) if i!= 'something@something.com']
emails, otherarray = map(list, map(itemgetter(0, 1), zip(*res)))

print(emails)      # ['abc@def.com', 'ghi@jkl.com']
print(otherarray)  # ['some', 'details']
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.