পাইথনের তালিকার শেষ আইটেমগুলি কীভাবে পাবেন?


288

আমার একটি তালিকার সর্বশেষ 9 নম্বর দরকার এবং আমি নিশ্চিত যে এটি কাটা দিয়ে করার একটি উপায় আছে তবে আমি এটি পেতে পারি না। আমি প্রথম 9 টি এর মতো পেতে পারি:

num_list[0:9]

উত্তর:


519

আপনি তার জন্য কাটা অপারেটরের সাথে নেতিবাচক পূর্ণসংখ্যার ব্যবহার করতে পারেন। পাইথন সিএলআই দোভাষী ব্যবহার করে এখানে একটি উদাহরণ দেওয়া হয়েছে:

>>> 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:]


11
মনে রাখবেন যে, -0হয় 0। সুতরাং সম্পূর্ণ a[-0:]শোধ করে a, শেষ শূন্য উপাদান নয় []। শূন্য রক্ষার জন্য, আপনি ব্যবহার করতে পারেন a[-n:] if n > 0 else []
nekketuuu

93

একটি নেতিবাচক সূচক তালিকার শেষ থেকে গণনা করা হবে, সুতরাং:

num_list[-9:]

53

slicing

পাইথন স্লাইসিং একটি অবিশ্বাস্যভাবে দ্রুত অপারেশন এবং এটি আপনার ডেটার অংশগুলি দ্রুত অ্যাক্সেস করার একটি সহজ উপায়।

একটি তালিকা থেকে শেষ নয়টি উপাদান পাওয়ার জন্য স্লাইস নোটেশন (বা কোনও স্ট্রিংয়ের মতো এটি সমর্থন করে এমন কোনও অনুক্রম) এর মতো দেখতে পাবেন:

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]

আপনার মানসিক সংক্ষেপণ খুব সহায়ক
স্বাঙ্কি কোডার

40

আপনি চান হিসাবে সর্বশেষ 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]

6

পুনরাবৃত্তির "লেজ" আইটেমগুলি পাওয়ার জন্য এখানে বেশ কয়েকটি বিকল্প রয়েছে:

প্রদত্ত

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))

বিস্তারিত

  • উ: dition তিহ্যবাহী পাইথন স্লাইসিং ভাষার অন্তর্নিহিত। এই বিকল্পটি স্ট্রিং, তালিকা এবং টিপলসের মতো ক্রমগুলির সাথে কাজ করে । তবে, এই ধরণের টুকরোটি পুনরাবৃত্তকারীগুলিতে কাজ করে না , যেমন iter(iterable)
  • বি একটি itertoolsরেসিপি । এটি যেকোন পুনরাবৃত্তির উপরে কাজ করার জন্য সাধারণ করা হয় এবং শেষ দ্রষ্ট্রে পুনরাবৃত্তির সমস্যাটি সমাধান করে। এই রেসিপিটি ম্যানুয়ালি প্রয়োগ করা উচিত কারণ এটি itertoolsমডিউলে সরকারীভাবে অন্তর্ভুক্ত করা হয়নি ।
  • গ। পরবর্তী সরঞ্জাম (বি) সহ অনেকগুলি রেসিপিগুলি তৃতীয় পক্ষের প্যাকেজগুলিতে সুবিধাজনকভাবে প্রয়োগ করা হয়েছে। এই লাইব্রেরিগুলি ইনস্টল ও আমদানি ম্যানুয়াল বাস্তবায়নকে বাধ্য করে। এর মধ্যে একটি লাইব্রেরি বলা হয় more_itertools(এর মাধ্যমে ইনস্টল করুন > pip install more-itertools); দেখতে more_itertools.tail
  • ডি itertoolsগ্রন্থাগারের সদস্য । দ্রষ্টব্য, itertools.islice নেতিবাচক স্লাইসিং সমর্থন করে না
  • E. আর একটি সরঞ্জাম প্রয়োগ করা হয়েছে more_itertoolsযা itertools.isliceনেতিবাচক কাটা কাটাকে সমর্থন করার জন্য জেনারালাইজ করে; দেখতে more_itertools.islice_extended

আমি কোনটি ব্যবহার করব?

এটা নির্ভর করে । বেশিরভাগ ক্ষেত্রে, ভাষাগুলিতে তৈরি হওয়া এবং বেশিরভাগ পুনরাবৃত্ত প্রকারকে সমর্থন করার কারণে স্লাইসিং (অপশন এ, অন্যান্য জবাব হিসাবে উল্লিখিত) সবচেয়ে সহজ বিকল্প। আরও সাধারণ পুনরাবৃত্তির জন্য, বাকী যে কোনও বিকল্প ব্যবহার করুন। দ্রষ্টব্য, সি এবং ই বিকল্পগুলির জন্য একটি তৃতীয় পক্ষের লাইব্রেরি ইনস্টল করা দরকার যা কিছু ব্যবহারকারী দরকারী মনে করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.