पायथन में एक सूची के अंतिम आइटम कैसे प्राप्त करें?


288

मुझे किसी सूची के अंतिम 9 नंबरों की आवश्यकता है और मुझे यकीन है कि इसे स्लाइसिंग के साथ करने का एक तरीका है, लेकिन मैं इसे प्राप्त नहीं कर सकता। मैं इस तरह से पहले 9 प्राप्त कर सकता हूं:

num_list[0:9]

जवाबों:


519

आप उसके लिए टुकड़ा करने वाले ऑपरेटर के साथ नकारात्मक पूर्णांक का उपयोग कर सकते हैं। यहाँ अजगर CLI दुभाषिया का उपयोग कर एक उदाहरण दिया गया है:

>>> 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 []
nekketsuuu

93

एक नकारात्मक सूचकांक सूची के अंत से गिना जाएगा, इसलिए:

num_list[-9:]

53

टुकड़ा करने की क्रिया

पायथन स्लाइसिंग एक अविश्वसनीय रूप से तेज़ ऑपरेशन है, और यह आपके डेटा के हिस्सों को जल्दी से एक्सेस करने का एक आसान तरीका है।

अंतिम नौ तत्वों को एक सूची से प्राप्त करने के लिए स्लाइस अंकन (या किसी अन्य अनुक्रम जो इसे समर्थन करता है, जैसे एक स्ट्रिंग) इस तरह दिखेगा:

num_list[-9:]

जब मैं इसे देखता हूं, तो मैं कोष्ठक में भाग को "अंत से 9 वें, अंत तक" पढ़ता हूं। (वास्तव में, मैं इसे "-9, ऑन" के रूप में मानसिक रूप से संक्षिप्त करता हूं)

स्पष्टीकरण:

पूर्ण संकेतन है

sequence[start:stop:step]

लेकिन बृहदान्त्र क्या पायथन बताता है कि आप इसे एक टुकड़ा दे रहे हैं और नियमित सूचकांक नहीं। यही कारण है कि पायथन 2 में सूचियों की नकल करने का मुहावरेदार तरीका है

list_copy = sequence[:]

और उन्हें साफ़ करना है:

del my_list[:]

(सूचियाँ प्राप्त list.copyऔर list.clearअजगर में 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

isliceitertools मॉड्यूल से इसे प्राप्त करने के लिए संभवतः एक और संभावित तरीका है। isliceनकारात्मक तर्क नहीं लेता है, इसलिए आदर्श रूप से आपके चलने योग्य के पास एक __reversed__विशेष विधि है - जो सूची में है - इसलिए आपको पहले अपनी सूची (या इसके साथ चलने योग्य __reversed__) को पास करना होगा reversed

>>> from itertools import islice
>>> islice(reversed(range(100)), 0, 9)
<itertools.islice object at 0xffeb87fc>

islice डेटा पाइपलाइन के आलसी मूल्यांकन के लिए अनुमति देता है, इसलिए डेटा को उत्प्रेरित करने के लिए, इसे एक कंस्ट्रक्टर को पास करें (जैसे list):

>>> list(islice(reversed(range(100)), 0, 9))
[99, 98, 97, 96, 95, 94, 93, 92, 91]

आपका मानसिक संक्षिप्त नाम बहुत मददगार है
Swanky Coder

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

विवरण

  • A. पारंपरिक पायथन स्लाइसिंग भाषा के लिए अंतर्निहित है। यह विकल्प स्ट्रिंग्स, सूचियों और ट्यूपल्स जैसे दृश्यों के साथ काम करता है । हालाँकि, इस तरह की स्लाइसिंग पुनरावृत्तियों पर काम नहीं करती है , उदाiter(iterable)
  • B. एक itertoolsनुस्खा । यह किसी भी चलने योग्य पर काम करने के लिए सामान्यीकृत है और अंतिम समाधान में पुनरावृत्त मुद्दे को हल करता है। यह नुस्खा मैन्युअल रूप से लागू किया जाना चाहिए क्योंकि यह आधिकारिक तौर पर इसमें शामिल नहीं हैitertools मॉड्यूल ।
  • C. बाद वाले टूल (बी) सहित कई व्यंजनों को तीसरे पक्ष के पैकेज में आसानी से लागू किया गया है। इन पुस्तकालयों को स्थापित करना और आयात करना मैनुअल कार्यान्वयन को कम करता है। इन पुस्तकालयों में से एक कहा जाता है more_itertools(के माध्यम से स्थापित > pip install more-itertools); देखmore_itertools.tail
  • डी itertools। पुस्तकालय का सदस्य । नोट, itertools.islice नकारात्मक स्लाइसिंग का समर्थन नहीं करता है
  • ई। एक और उपकरण लागू किया गया है more_itertoolsजो itertools.isliceनकारात्मक स्लाइसिंग का समर्थन करने के लिए सामान्यीकृत करता है; देखते हैं more_itertools.islice_extended

मैं किसका उपयोग करूं?

यह निर्भर करता है । ज्यादातर मामलों में, स्लाइसिंग (विकल्प ए, जैसा कि अन्य उत्तरों में उल्लेख किया गया है) सबसे सरल विकल्प है क्योंकि यह भाषा में बनाया गया है और यह सबसे उपयोगी प्रकारों का समर्थन करता है। अधिक सामान्य पुनरावृत्तियों के लिए, शेष विकल्पों में से किसी का उपयोग करें। ध्यान दें, विकल्प C और E को तृतीय-पक्ष लाइब्रेरी स्थापित करने की आवश्यकता होती है, जिसे कुछ उपयोगकर्ता उपयोगी पा सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.