পাইথন ব্যবহার করে অ্যারে থেকে নির্দিষ্ট উপাদান কীভাবে সরিয়ে ফেলা যায়


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
আপনি প্রথমটি কীভাবে চেক করবেন যে আইটেমটি প্রারম্ভিক তালিকায় আছে? এমন একটি কেস থাকতে পারে যেখানে এটি বিদ্যমান নেই এবং আপনাকে এটি অপসারণ করতে হবে না।
লোকোবয়

17

অবাঞ্ছিত মানগুলি মুছে ফেলার একটি ঝরঝরে এবং ক্ষয় পদ্ধতি ব্যবহার করে filter()এবং সরবরাহ করে lambda:

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

এটি ইমেলগুলি পরিবর্তন করে না। এটি নতুন তালিকা তৈরি করে নতুন ইমেলগুলি কেবলমাত্র উপাদানগুলির জন্য যা বেনামে ফাংশনটি সত্য করে দেয়।


5

লুপের জন্য আপনার সঠিক নয়, যদি আপনার লুপ ব্যবহারের জন্য সূচকের প্রয়োজন হয়:

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

আপনার ক্ষেত্রে, বোগদান সমাধান ঠিক আছে, তবে আপনার ডেটা স্ট্রাকচার পছন্দটি এতটা ভাল নয়। একই সূচীতে অন্যের ডেটা সম্পর্কিত একটি থেকে ডেটা সহ এই দুটি তালিকা বজায় রাখা আনাড়ি cl

টিপলের একটি তালিকা (ইমেল, অন্যান্য ডেটা) ভাল হতে পারে বা কী হিসাবে ইমেলের সাথে একটি ডিক।


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
@ বোগদানের উত্তরের তুলনায় এটি কীভাবে "বুদ্ধিমান" তা নিশ্চিত নয়, যা অনেক বেশি, পরিষ্কার er
জর্দান ল্যাপ

অ্যারে তালিকা হিসাবে একই নয় তা নির্দেশ করার জন্য ধন্যবাদ। নির্বাচিত উত্তরটি ২.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']
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.