উত্তর:
আপনি তার জন্য কাটা অপারেটরের সাথে নেতিবাচক পূর্ণসংখ্যার ব্যবহার করতে পারেন। পাইথন সিএলআই দোভাষী ব্যবহার করে এখানে একটি উদাহরণ দেওয়া হয়েছে:
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> a[-9:]
[4, 5, 6, 7, 8, 9, 10, 11, 12]
গুরুত্বপূর্ণ লাইন হয় a[-9:]
-0
হয় 0
। সুতরাং সম্পূর্ণ a[-0:]
শোধ করে a
, শেষ শূন্য উপাদান নয় []
। শূন্য রক্ষার জন্য, আপনি ব্যবহার করতে পারেন a[-n:] if n > 0 else []
।
পাইথন স্লাইসিং একটি অবিশ্বাস্যভাবে দ্রুত অপারেশন এবং এটি আপনার ডেটার অংশগুলি দ্রুত অ্যাক্সেস করার একটি সহজ উপায়।
একটি তালিকা থেকে শেষ নয়টি উপাদান পাওয়ার জন্য স্লাইস নোটেশন (বা কোনও স্ট্রিংয়ের মতো এটি সমর্থন করে এমন কোনও অনুক্রম) এর মতো দেখতে পাবেন:
num_list[-9:]
আমি যখন এটি দেখতে পাচ্ছি, আমি বন্ধনীর অংশটি "শেষ থেকে শেষ পর্যন্ত 9 ম" হিসাবে পড়েছি। (আসলে, আমি এটি মানসিকভাবে "-9, অন" হিসাবে সংক্ষিপ্ত বিবরণ দিচ্ছি)
সম্পূর্ণ স্বরলিপি হয়
sequence[start:stop:step]
কিন্তু কোলন যা পাইথনকে বলে তা আপনি এটি একটি স্লাইস দিচ্ছেন এবং নিয়মিত সূচক নয়। এজন্য পাইথন 2-এ তালিকাগুলি অনুলিপি করার মূর্তিযুক্ত পদ্ধতি
list_copy = sequence[:]
এবং তাদের সাফ করার সাথে রয়েছে:
del my_list[:]
(তালিকাগুলি পায় list.copy
এবং list.clear
পাইথন 3 এ 3.)
আপনি স্লাইসটি list.__getitem__
পদ্ধতিতে পাস করা থেকে আলাদা করে ফেলা দরকারী মনে করতে পারেন ( এটি স্কোয়ার বন্ধনীগুলি কি করে )। এমনকি যদি আপনি এটিতে নতুন না হন তবে এটি আপনার কোডটি আরও পঠনযোগ্য রাখে যাতে আপনার কোডটি পড়তে পারে এমন অন্যরা আরও সহজেই বুঝতে পারে যে আপনি কী করছেন।
যাইহোক, আপনি কেবল কোনও ভেরিয়েবলের সাথে কলোন দ্বারা পৃথক করা কিছু পূর্ণসংখ্যাকে নির্ধারণ করতে পারবেন না। আপনি স্লাইস অবজেক্ট ব্যবহার করতে হবে:
last_nine_slice = slice(-9, None)
দ্বিতীয় যুক্তি, None
, প্রয়োজনীয় হয়, তাই যে প্রথম আর্গুমেন্ট হিসাবে ব্যাখ্যা করা হয় start
যুক্তি অন্যথায় এটি হবে stop
যুক্তি ।
তারপরে আপনি স্লাইস অবজেক্টটিকে আপনার ক্রমটি পাস করতে পারেন:
>>> list(range(100))[last_nine_slice]
[91, 92, 93, 94, 95, 96, 97, 98, 99]
islice
islice
ইটারটুলস মডিউল থেকে এটি পাওয়ার আরও একটি সম্ভবত পারফরম্যান্ট উপায়। islice
আপনার iterable রয়েছে তাই আদর্শভাবে নেতিবাচক যুক্তি গ্রহণ করে না, __reversed__
বিশেষ পদ্ধতি - যা তালিকা নেই আছে - তাই প্রথমে আপনি আপনার তালিকা (অথবা iterable সঙ্গে পাস করতে হবে __reversed__
পর্যন্ত) reversed
।
>>> from itertools import islice
>>> islice(reversed(range(100)), 0, 9)
<itertools.islice object at 0xffeb87fc>
আইলিস ডাটা পাইপলাইনের অলস মূল্যায়নের জন্য অনুমতি দেয়, সুতরাং তথ্যটি বাস্তবায়িত করতে, এটি কোনও নির্মাণকারীকে (যেমন list
) সরবরাহ করতে পারেন:
>>> list(islice(reversed(range(100)), 0, 9))
[99, 98, 97, 96, 95, 94, 93, 92, 91]
আপনি চান হিসাবে সর্বশেষ 9 টি উপাদান নাম তালিকা [-9:] ব্যবহার করে বাম থেকে ডানে বা ডান থেকে বামে পড়তে পারেন [: - 10: -1], আপনি যেমন চান তেমন।
>>> a=range(17)
>>> print a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
>>> print a[-9:]
[8, 9, 10, 11, 12, 13, 14, 15, 16]
>>> print a[:-10:-1]
[16, 15, 14, 13, 12, 11, 10, 9, 8]
পুনরাবৃত্তির "লেজ" আইটেমগুলি পাওয়ার জন্য এখানে বেশ কয়েকটি বিকল্প রয়েছে:
প্রদত্ত
n = 9
iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
পছন্দসই আউটপুট
[2, 3, 4, 5, 6, 7, 8, 9, 10]
কোড
আমরা নিম্নলিখিত বিকল্পগুলির মধ্যে ব্যবহার করে পরের আউটপুটটি পাই:
from collections import deque
import itertools
import more_itertools
# A: Slicing
iterable[-n:]
# B: Implement an itertools recipe
def tail(n, iterable):
"""Return an iterator over the last *n* items of *iterable*.
>>> t = tail(3, 'ABCDEFG')
>>> list(t)
['E', 'F', 'G']
"""
return iter(deque(iterable, maxlen=n))
list(tail(n, iterable))
# C: Use an implemented recipe, via more_itertools
list(more_itertools.tail(n, iterable))
# D: islice, via itertools
list(itertools.islice(iterable, len(iterable)-n, None))
# E: Negative islice, via more_itertools
list(more_itertools.islice_extended(iterable, -n, None))
বিস্তারিত
iter(iterable)
।itertools
রেসিপি । এটি যেকোন পুনরাবৃত্তির উপরে কাজ করার জন্য সাধারণ করা হয় এবং শেষ দ্রষ্ট্রে পুনরাবৃত্তির সমস্যাটি সমাধান করে। এই রেসিপিটি ম্যানুয়ালি প্রয়োগ করা উচিত কারণ এটি itertools
মডিউলে সরকারীভাবে অন্তর্ভুক্ত করা হয়নি ।more_itertools
(এর মাধ্যমে ইনস্টল করুন > pip install more-itertools
); দেখতে more_itertools.tail
।itertools
গ্রন্থাগারের সদস্য । দ্রষ্টব্য, itertools.islice
নেতিবাচক স্লাইসিং সমর্থন করে না । more_itertools
যা itertools.islice
নেতিবাচক কাটা কাটাকে সমর্থন করার জন্য জেনারালাইজ করে; দেখতে more_itertools.islice_extended
।আমি কোনটি ব্যবহার করব?
এটা নির্ভর করে । বেশিরভাগ ক্ষেত্রে, ভাষাগুলিতে তৈরি হওয়া এবং বেশিরভাগ পুনরাবৃত্ত প্রকারকে সমর্থন করার কারণে স্লাইসিং (অপশন এ, অন্যান্য জবাব হিসাবে উল্লিখিত) সবচেয়ে সহজ বিকল্প। আরও সাধারণ পুনরাবৃত্তির জন্য, বাকী যে কোনও বিকল্প ব্যবহার করুন। দ্রষ্টব্য, সি এবং ই বিকল্পগুলির জন্য একটি তৃতীয় পক্ষের লাইব্রেরি ইনস্টল করা দরকার যা কিছু ব্যবহারকারী দরকারী মনে করতে পারেন।