এখন আমি জানি যে পুনরাবৃত্তীয় লুপিংয়ের সময় তালিকাটি পরিবর্তন করা নিরাপদ নয়। তবে, ধরুন আমার কাছে স্ট্রিংগুলির একটি তালিকা রয়েছে এবং আমি নিজেই স্ট্রিংগুলি ছাঁটাই করতে চাই। পরিবর্তনীয় মানগুলি প্রতিস্থাপনকে সংশোধনী হিসাবে গণ্য করা হয়?
এখন আমি জানি যে পুনরাবৃত্তীয় লুপিংয়ের সময় তালিকাটি পরিবর্তন করা নিরাপদ নয়। তবে, ধরুন আমার কাছে স্ট্রিংগুলির একটি তালিকা রয়েছে এবং আমি নিজেই স্ট্রিংগুলি ছাঁটাই করতে চাই। পরিবর্তনীয় মানগুলি প্রতিস্থাপনকে সংশোধনী হিসাবে গণ্য করা হয়?
উত্তর:
এটি দুর্বল রূপ হিসাবে বিবেচিত। স্লাইস অ্যাসাইনমেন্ট সহ পরিবর্তে একটি তালিকা বোধগম্য ব্যবহার করুন যদি আপনার তালিকার বিদ্যমান রেফারেন্সগুলি ধরে রাখতে হয়।
a = [1, 3, 5]
b = a
a[:] = [x + 2 for x in a]
print(b)
print bবিবৃতিটি কার্যকর করা হবে তখন আপনি বলতে পারবেন aপ্রতিস্থাপনের পরিবর্তে জায়গায় জায়গায় পরিবর্তন করা হয়েছে কিনা । আরেকটি সম্ভাবনা হ'ল print b is aতারা উভয় এখনও একই বস্তুর উল্লেখ করে কিনা তা দেখার জন্য।
যেহেতু নীচের লুপটি কেবল ইতিমধ্যে দেখা উপাদানগুলিকে সংশোধন করে, তাই এটি গ্রহণযোগ্য হিসাবে বিবেচিত হবে:
a = ['a',' b', 'c ', ' d ']
for i, s in enumerate(a):
a[i] = s.strip()
print(a) # -> ['a', 'b', 'c', 'd']
যা থেকে পৃথক:
a[:] = [s.strip() for s in a]
এটিতে অস্থায়ী তালিকা তৈরির প্রয়োজন হয় না এবং আসলটি প্রতিস্থাপনের জন্য এটি নিয়োগের প্রয়োজন হয় যদিও এর জন্য আরও সূচীকরণ ক্রিয়াকলাপগুলির প্রয়োজন হয় না।
সতর্কতা: যদিও আপনি এন্ট্রিগুলিকে এভাবে পরিবর্তন করতে পারেন তবে listসমস্যার মুখোমুখি হওয়ার ঝুঁকি না রেখে আপনি আইটেমের সংখ্যা পরিবর্তন করতে পারবেন না ।
এখানে আমি কী বোঝাতে চাইছি তার একটি উদাহরণ এখানে — বিন্দুটি মুছে ফেলা হচ্ছে point বিন্দু থেকে সূচীকরণ:
b = ['a', ' b', 'c ', ' d ']
for i, s in enumerate(b):
if s.strip() != b[i]: # leading or trailing whitespace?
del b[i]
print(b) # -> ['a', 'c '] # WRONG!
(ফলাফলটি ভুল কারণ এটি থাকা সমস্ত আইটেম মুছে ফেলেনি))
হালনাগাদ
যেহেতু এটি একটি মোটামুটি জনপ্রিয় উত্তর, কার্যকরভাবে কীভাবে "ইন-প্লেস" এন্ট্রিগুলি মুছে ফেলা যায় (যদিও এটি ঠিক তেমন প্রশ্ন নয়):
b = ['a',' b', 'c ', ' d ']
b[:] = [entry for entry in b if entry.strip() == entry]
print(b) # -> ['a'] # CORRECT
for i in aযদিও সিনট্যাক্সে পৃথক উপাদানগুলির কেবল একটি অনুলিপি তৈরি করে ? এটি অত্যন্ত বিপরীতমুখী, অন্য ভাষা থেকে আপাতদৃষ্টিতে পৃথক এবং আমার কোডটিতে ত্রুটি রয়েছে যার ফলে আমাকে দীর্ঘ সময়ের জন্য ডিবাগ করতে হয়েছিল। পাইথন টিউটোরিয়াল এমনকি এটি উল্লেখ করে না। যদিও এর কিছু কারণ থাকতে হবে?
a[i]এবং s) কেন ব্যবহার করবেন? আমি বরং অনেক কিছু করতাম a[i] = a[i].strip()।
a[i] = s.strip()কেবল একটি সূচিকরণ কাজ করে।
enumerate(b)প্রতিটি পুনরাবৃত্তির উপর একটি সূচীকরণ অপারেশন করে এবং আপনি এর সাথে আরও একটি করছেন a[i] =। এএএআইএফকি পাইপনে এই লুপটি কার্যকর করা অসম্ভব প্রতি লুপ পুনরাবৃত্তির জন্য কেবল 1 টি সূচীকরণ অপারেশন দিয়ে :(
লুপ বৈকল্পিকের জন্য আরও একটি, আমার কাছে গণনাযুক্ত () এর চেয়ে পরিষ্কার মনে হচ্ছে:
for idx in range(len(list)):
list[idx]=... # set a new value
# some other code which doesn't let you use a list comprehension
range(len(list))পাইথনের মতো কোড গন্ধের মতো কিছু ব্যবহার করা বিবেচনা করে ।
enumerateএকটি জেনারেটর তাই এটি কোনও তালিকা তৈরি করে না t টুপলস, তালিকার মধ্য দিয়ে পুনরাবৃত্তি হওয়ার সাথে সাথে এটি একবারে তাদের তৈরি করে। ধীরে ধীরে কোনটি বলার একমাত্র উপায় হ'ল timeit।
তালিকার পুনরাবৃত্তি করার সময় প্রতিটি উপাদানকে সংশোধন করা ভাল, যতক্ষণ না আপনি তালিকাতে উপাদানগুলি যোগ / সরান না।
আপনি তালিকা বোঝার ব্যবহার করতে পারেন:
l = ['a', ' list', 'of ', ' string ']
l = [item.strip() for item in l]
বা কেবল C-styleলুপের জন্য করুন:
for index, item in enumerate(l):
l[index] = item.strip()
না আপনি তালিকার "সামগ্রী" পরিবর্তন করতে পারবেন না, যদি আপনি সেইভাবে স্ট্রিংগুলিকে পরিবর্তন করতে পারেন ate কিন্তু পাইথনে এগুলি পরিবর্তনীয় নয়। যে কোনও স্ট্রিং অপারেশন একটি নতুন স্ট্রিং দেয়।
আপনি যদি জানতেন এমন সামগ্রীর একটি তালিকা যদি আপনি পরিবর্তন করতে পারেন তবে আপনি যতক্ষণ তালিকার প্রকৃত বিষয়বস্তু পরিবর্তন না করে আপনি এটি করতে পারতেন।
এইভাবে আপনাকে কোনও ধরণের মানচিত্র তৈরি করতে হবে। আপনি যদি কোনও জেনারেটর এক্সপ্রেশন ব্যবহার করেন তবে পুনরাবৃত্তি করার সাথে সাথে [অপারেশন] সম্পন্ন হবে এবং আপনি স্মৃতি সংরক্ষণ করবেন।
জেমশিত ইস্কেন্দেরোভ এবং ইগনাসিও ওয়াজকেজ-আব্রামসের দেওয়া উত্তরটি সত্যিই ভাল। এটি এই উদাহরণের সাথে আরও চিত্রিত করা যেতে পারে: এটি কল্পনা করুন
ক) দুটি ভেক্টর সহ একটি তালিকা আপনাকে দেওয়া হয়েছে;
খ) আপনি তালিকাটি অতিক্রম করতে এবং অ্যারের প্রত্যেকের ক্রমের বিপরীত করতে চান
বলুন আপনার আছে
v = np.array([1, 2,3,4])
b = np.array([3,4,6])
for i in [v, b]:
i = i[::-1] # this command does not reverse the string
print([v,b])
তুমি পাবে
[array([1, 2, 3, 4]), array([3, 4, 6])]
অন্যদিকে, আপনি যদি
v = np.array([1, 2,3,4])
b = np.array([3,4,6])
for i in [v, b]:
i[:] = i[::-1] # this command reverses the string
print([v,b])
ফলাফল হলো
[array([4, 3, 2, 1]), array([6, 4, 3])]
আপনার স্ট্রিংটি কী কী স্ট্রিংগুলি অপসারণ করবেন তা স্থির করার মানদণ্ডটি কী তা পরিষ্কার নয় তবে আপনি যদি মুছে ফেলতে চান এমন স্ট্রিংগুলির একটি তালিকা বা তৈরি করতে পারেন তবে আপনি নিম্নলিখিতটি করতে পারেন:
my_strings = ['a','b','c','d','e']
undesirable_strings = ['b','d']
for undesirable_string in undesirable_strings:
for i in range(my_strings.count(undesirable_string)):
my_strings.remove(undesirable_string)
যা আমার_স্ট্রিংগুলিকে ['ক', 'সি', 'ই'] তে পরিবর্তন করে