जवाबों:
आप उसके लिए टुकड़ा करने वाले ऑपरेटर के साथ नकारात्मक पूर्णांक का उपयोग कर सकते हैं। यहाँ अजगर 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:]
-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.)
आपको इसे स्लाइस बनाने की 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
itertools मॉड्यूल से इसे प्राप्त करने के लिए संभवतः एक और संभावित तरीका है। 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]
पिछले 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
।मैं किसका उपयोग करूं?
यह निर्भर करता है । ज्यादातर मामलों में, स्लाइसिंग (विकल्प ए, जैसा कि अन्य उत्तरों में उल्लेख किया गया है) सबसे सरल विकल्प है क्योंकि यह भाषा में बनाया गया है और यह सबसे उपयोगी प्रकारों का समर्थन करता है। अधिक सामान्य पुनरावृत्तियों के लिए, शेष विकल्पों में से किसी का उपयोग करें। ध्यान दें, विकल्प C और E को तृतीय-पक्ष लाइब्रेरी स्थापित करने की आवश्यकता होती है, जिसे कुछ उपयोगकर्ता उपयोगी पा सकते हैं।