जवाबों:
अन्य उत्तर केवल एक अनुक्रम के लिए काम करते हैं।
किसी भी चलने योग्य के लिए, पहला आइटम छोड़ने के लिए:
itercars = iter(cars)
next(itercars)
for car in itercars:
# do work
यदि आप अंतिम को छोड़ना चाहते हैं, तो आप ऐसा कर सकते हैं:
itercars = iter(cars)
# add 'next(itercars)' here if you also want to skip the first
prev = next(itercars)
for car in itercars:
# do work on 'prev' not 'car'
# at end of loop:
prev = car
# now you can do whatever you want to do to the last one on 'prev'
पायथन में पहले तत्व को छोड़ने के लिए आप बस लिख सकते हैं
for car in cars[1:]:
# Do What Ever you want
या अंतिम चुनाव को छोड़ना
for car in cars[:-1]:
# Do What Ever you want
आप किसी भी अनुक्रम के लिए इस अवधारणा का उपयोग कर सकते हैं।
पहला आइटम छोड़ने का सबसे अच्छा तरीका है:
from itertools import islice
for car in islice(cars, 1, None):
# do something
इस मामले में islice को 1 के स्टार्ट-पॉइंट और किसी के एंड पॉइंट से जोड़ा जाता है, जो इटरेटर के अंत को दर्शाता है।
किसी पुनरावृत्त के अंत से आइटम को छोड़ने में सक्षम होने के लिए, आपको इसकी लंबाई (हमेशा एक सूची के लिए संभव है, लेकिन जरूरी नहीं कि आप जिस चीज़ पर पुनरावृति कर सकते हैं उसके लिए आवश्यक हो)। उदाहरण के लिए, islice (कारों, 1, लेन (कारें) -1) कारों की सूची में पहले और आखिरी आइटम को छोड़ देगा।
isliceतरह की शुरुआत और / या अंत में बहुत अच्छी तरह से उपयोग करने पर वस्तुओं की एक मनमानी संख्या को लंघन करता है , बिना किसी लंबाई के या पूरी तरह से आवश्यक वस्तुओं को स्मृति में अधिक आइटम संग्रहीत करने के बिना।
isliceवह है जो dequeपूरे इट्रेटर को नहीं, बल्कि पास किया जाता है, और यह केवल अंत में छोड़ देने के लिए मदों की संख्या की लंबाई है। यह मेमोरी में पूरे पुनरावृत्ति स्टोर नहीं करता है।
यहां एक अधिक सामान्य जनरेटर फ़ंक्शन है जो किसी भी आइटम्स की शुरुआत और अंत से किसी भी संख्या को छोड़ता है:
def skip(iterable, at_start=0, at_end=0):
it = iter(iterable)
for x in itertools.islice(it, at_start):
pass
queue = collections.deque(itertools.islice(it, at_end))
for x in it:
queue.append(x)
yield queue.popleft()
उदाहरण उपयोग:
>>> list(skip(range(10), at_start=2, at_end=2))
[2, 3, 4, 5, 6, 7]
at_end == 0।
skip(xrange(10000000), 1)का उपयोग करेगा at_end=0, इसलिए ऐसा पैरामीटर deque()होगा islice(it, 0), जो केवल शून्य तत्वों का उपभोग करेगा it। यह बहुत सारी मेमोरी नहीं लेगा।
for item in do_not_use_list_as_a_name[1:-1]:
#...do whatever
listएक चर नाम के रूप में उपयोग न करें
listको फिर से बाध्य किया जा सकता है। इसलिए आपको इसका उपयोग नहीं करना चाहिए , बल्कि इसका उपयोग नहीं करना चाहिए ।
@SvenMarnach के उत्तर के आधार पर, लेकिन थोड़ा सरल और बिना deque का उपयोग किए
>>> def skip(iterable, at_start=0, at_end=0):
it = iter(iterable)
it = itertools.islice(it, at_start, None)
it, it1 = itertools.tee(it)
it1 = itertools.islice(it1, at_end, None)
return (next(it) for _ in it1)
>>> list(skip(range(10), at_start=2, at_end=2))
[2, 3, 4, 5, 6, 7]
>>> list(skip(range(10), at_start=2, at_end=5))
[2, 3, 4]
यह भी ध्यान दें, मेरे timeitपरिणाम के आधार पर , यह deque समाधान की तुलना में थोड़ा तेज है
>>> iterable=xrange(1000)
>>> stmt1="""
def skip(iterable, at_start=0, at_end=0):
it = iter(iterable)
it = itertools.islice(it, at_start, None)
it, it1 = itertools.tee(it)
it1 = itertools.islice(it1, at_end, None)
return (next(it) for _ in it1)
list(skip(iterable,2,2))
"""
>>> stmt2="""
def skip(iterable, at_start=0, at_end=0):
it = iter(iterable)
for x in itertools.islice(it, at_start):
pass
queue = collections.deque(itertools.islice(it, at_end))
for x in it:
queue.append(x)
yield queue.popleft()
list(skip(iterable,2,2))
"""
>>> timeit.timeit(stmt = stmt1, setup='from __main__ import iterable, skip, itertools', number = 10000)
2.0313770640908047
>>> timeit.timeit(stmt = stmt2, setup='from __main__ import iterable, skip, itertools, collections', number = 10000)
2.9903135454296716
tee(), आप अभी भी जनरेटर के लिए मेमोरी में पूरी सूची बना रहे हैं, है ना? (अपने it1)
उदाहरण:
mylist=['one'.'two','three'.'four'.'five']
for i in mylist[1:]:
print(i)
अजगर सूचकांक में 0 से शुरू, हम पुनरावृत्ति में हेरफेर करने के लिए स्लिंगिंग ऑपरेटर का उपयोग कर सकते हैं।
for i in range(1,-1):
ठीक है, आपका सिंटैक्स वास्तव में शुरू करने के लिए पायथन नहीं है।
पाइथन में बदलाव कंटेनरों की सामग्री पर होते हैं (अच्छी तरह से, तकनीकी रूप से यह पुनरावृत्तियों पर), एक सिंटैक्स के साथ for item in container। इस मामले में, कंटेनर carsसूची है, लेकिन आप पहले और अंतिम तत्वों को छोड़ना चाहते हैं, तो इसका मतलब है कि cars[1:-1](पायथन सूची शून्य-आधारित हैं, नकारात्मक संख्याएं अंत से गिना जाती हैं, और :सिंटैक्स स्लाइसिंग है।
इसलिए आप यह चाहते हैं
for c in cars[1:-1]:
do something with c
यहाँ मेरा पसंदीदा विकल्प है। यह लूप पर बहुत कुछ जोड़ने की आवश्यकता नहीं है, और कुछ भी नहीं बनाता है लेकिन उपकरण में बनाया गया है।
से जाओ:
for item in my_items:
do_something(item)
सेवा:
for i, item in enumerate(my_items):
if i == 0:
continue
do_something(item)
यदि carsएक अनुक्रम है तो आप बस कर सकते हैं
for car in cars[1:-1]:
pass
more_itertoolsपरियोजना का विस्तार itertools.isliceनकारात्मक सूचकांक को संभालने के लिए।
उदाहरण
import more_itertools as mit
iterable = 'ABCDEFGH'
list(mit.islice_extended(iterable, 1, -1))
# Out: ['B', 'C', 'D', 'E', 'F', 'G']
इसलिए, आप इसे पुन: उपयोग करने योग्य तत्वों को पहले और अंतिम आइटम्स के बीच स्लाइस कर सकते हैं:
for car in mit.islice_extended(cars, 1, -1):
# do something
मैं इसे इस तरह से करता हूं, भले ही यह हर बार काम करने वाले हैक की तरह दिखता है:
ls_of_things = ['apple', 'car', 'truck', 'bike', 'banana']
first = 0
last = len(ls_of_things)
for items in ls_of_things:
if first == 0
first = first + 1
pass
elif first == last - 1:
break
else:
do_stuff
first = first + 1
pass
for n, i in enumerate(cars): if n!= 0: do something to i। तर्क यह है कि यह प्रत्येक मान के लिए एक 'काउंटर' जोड़ता है जिसे आप बाद में जैसे लक्ष्य कर सकते हैंif n == some_value। इस उदाहरण में यह i के प्रत्येक उदाहरण के लिए कुछ करेगा, सिवाय पहले वाले के।