এই উত্তরটি মূলত এমন প্রশ্নের জবাবে লেখা হয়েছিল যা পরে নকল হিসাবে চিহ্নিত করা হয়েছে:
পাইথনের তালিকা থেকে স্থানাঙ্কগুলি সরানো হচ্ছে
আপনার কোডে দুটি সমস্যা রয়েছে:
1) অপসারণ () ব্যবহার করার সময় আপনি পূর্ণসংখ্যা সরানোর চেষ্টা করেন যেখানে আপনাকে একটি টিউপল অপসারণ করতে হবে।
২) ফর লুপটি আপনার তালিকার আইটেমগুলি এড়িয়ে যাবে।
আমরা যখন আপনার কোডটি কার্যকর করি তখন কী ঘটে তা চালানো যাক:
>>> L1 = [(1,2), (5,6), (-1,-2), (1,-2)]
>>> for (a,b) in L1:
... if a < 0 or b < 0:
... L1.remove(a,b)
...
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
TypeError: remove() takes exactly one argument (2 given)
প্রথম সমস্যাটি হ'ল আপনি () অপসারণ করতে 'ক' এবং 'বি' উভয় পাশ করছেন, তবে সরান () কেবলমাত্র একটি যুক্তি গ্রহণ করে। তাহলে কীভাবে আমরা আপনার তালিকার সাথে সঠিকভাবে কাজ করতে মুছে ফেলতে পারি ()? আপনার তালিকার প্রতিটি উপাদান কী তা আমাদের খুঁজে বের করতে হবে। এক্ষেত্রে প্রত্যেকেই একটি টিপল। এটি দেখতে, আসুন তালিকার একটি উপাদান অ্যাক্সেস করুন (সূচী 0 থেকে শুরু হয়):
>>> L1[1]
(5, 6)
>>> type(L1[1])
<type 'tuple'>
আহা! এল 1 এর প্রতিটি উপাদান আসলে একটি টিপল। সুতরাং এটি অপসারণ করতে আমাদের পাস করা দরকার। পাইথনের টিপলগুলি খুব সহজ, এগুলি কেবল বন্ধনীগুলিতে মানগুলি বদ্ধ করে তৈরি করা হয়। "ক, খ" টিউপল নয়, তবে "(ক, খ)" একটি টিপল। সুতরাং আমরা আপনার কোডটি পরিবর্তন করে আবার চালাব:
# The remove line now includes an extra "()" to make a tuple out of "a,b"
L1.remove((a,b))
এই কোডটি কোনও ত্রুটি ছাড়াই চলে, তবে আসুন এটি আউটপুট তালিকাটি দেখুন:
L1 is now: [(1, 2), (5, 6), (1, -2)]
(1, -2) এখনও কেন আপনার তালিকায় রয়েছে? এটি পুনরুক্ত করার জন্য একটি লুপ ব্যবহার করার সময় তালিকার সংশোধন করে দেখা যায় বিশেষ যত্ন না করে খুব খারাপ ধারণা। (1, -2) তালিকায় থাকার কারণটি হ'ল তালিকার মধ্যে থাকা প্রতিটি আইটেমের অবস্থানগুলি লুপটির পুনরাবৃত্তির মধ্যে পরিবর্তিত হয়েছিল। উপরের কোডটি দীর্ঘতর তালিকাতে ফিড দিলে কী ঘটে তা দেখা যাক:
L1 = [(1,2),(5,6),(-1,-2),(1,-2),(3,4),(5,7),(-4,4),(2,1),(-3,-3),(5,-1),(0,6)]
### Outputs:
L1 is now: [(1, 2), (5, 6), (1, -2), (3, 4), (5, 7), (2, 1), (5, -1), (0, 6)]
আপনি যে ফলাফলটি থেকে অনুমান করতে পারেন, প্রতিবার শর্তসাপেক্ষ বিবৃতিটি সত্যের কাছে মূল্যায়ন করে এবং কোনও তালিকা আইটেম সরিয়ে ফেলা হয়, লুপের পরবর্তী পুনরাবৃত্তি তালিকার পরবর্তী আইটেমটির মূল্যায়ন এড়িয়ে যায় কারণ এর মানগুলি এখন বিভিন্ন সূচকগুলিতে অবস্থিত।
সবচেয়ে স্বজ্ঞাত সমাধান হ'ল তালিকাটি অনুলিপি করুন, তারপরে মূল তালিকাটি পুনরাবৃত্তি করুন এবং কেবল অনুলিপিটি সংশোধন করুন। আপনি এটির মতো করে চেষ্টা করে দেখতে পারেন:
L2 = L1
for (a,b) in L1:
if a < 0 or b < 0 :
L2.remove((a,b))
# Now, remove the original copy of L1 and replace with L2
print L2 is L1
del L1
L1 = L2; del L2
print ("L1 is now: ", L1)
তবে আউটপুটটি আগের মতো হবে:
'L1 is now: ', [(1, 2), (5, 6), (1, -2), (3, 4), (5, 7), (2, 1), (5, -1), (0, 6)]
এটি কারণ যখন আমরা এল 2 তৈরি করি তখন পাইথন আসলে কোনও নতুন বস্তু তৈরি করে না। পরিবর্তে, এটি L2 হিসাবে একই বস্তুর কাছে কেবল L2 উল্লেখ করেছে। আমরা এটি 'এর' দিয়ে যাচাই করতে পারি যা নিছক "সমান" (==) থেকে পৃথক।
>>> L2=L1
>>> L1 is L2
True
আমরা copy.copy () ব্যবহার করে একটি সত্য অনুলিপি তৈরি করতে পারি। তারপরে সবকিছু প্রত্যাশার মতো কাজ করে:
import copy
L1 = [(1,2), (5,6),(-1,-2), (1,-2),(3,4),(5,7),(-4,4),(2,1),(-3,-3),(5,-1),(0,6)]
L2 = copy.copy(L1)
for (a,b) in L1:
if a < 0 or b < 0 :
L2.remove((a,b))
# Now, remove the original copy of L1 and replace with L2
del L1
L1 = L2; del L2
>>> L1 is now: [(1, 2), (5, 6), (3, 4), (5, 7), (2, 1), (0, 6)]
শেষ পর্যন্ত, এল 1 এর সম্পূর্ণ নতুন কপি তৈরি করার চেয়ে আরও একটি ক্লিনার সমাধান রয়েছে। বিপরীত () ফাংশন:
L1 = [(1,2), (5,6),(-1,-2), (1,-2),(3,4),(5,7),(-4,4),(2,1),(-3,-3),(5,-1),(0,6)]
for (a,b) in reversed(L1):
if a < 0 or b < 0 :
L1.remove((a,b))
print ("L1 is now: ", L1)
>>> L1 is now: [(1, 2), (5, 6), (3, 4), (5, 7), (2, 1), (0, 6)]
দুর্ভাগ্যক্রমে, আমি বিপরীত () কীভাবে কাজ করে তা পর্যাপ্তরূপে বর্ণনা করতে পারি না। কোনও তালিকা এতে পাস করার পরে এটি একটি 'তালিকার বিপরীতমুখী' অবজেক্ট প্রদান করে। ব্যবহারিক উদ্দেশ্যে, আপনি এটিকে তার যুক্তির বিপরীত অনুলিপি তৈরি হিসাবে ভাবতে পারেন। এটিই আমার সমাধানের সমাধান।