উত্তর:
অন্যান্য উত্তরগুলি কেবল একটি অনুক্রমের জন্য কাজ করে।
যেকোন পুনরাবৃত্তির জন্য, প্রথম আইটেমটি এড়িয়ে যেতে:
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
এই ক্ষেত্রে আইলিসটি 1-এর একটি সূচনা-পয়েন্ট এবং কোনওটির শেষ বিন্দুতে পুনরাবৃত্তি করা হয় যা পুনরাবৃত্তির শেষটি নির্দেশ করে।
পুনরাবৃত্তির শেষে আইটেমগুলি এড়াতে সক্ষম হতে আপনার দৈর্ঘ্যটি জানতে হবে (একটি তালিকার পক্ষে সর্বদা সম্ভব, তবে প্রয়োজনীয়তার জন্য যা আপনি পুনরাবৃত্তি করতে পারেন তা নয়)। উদাহরণস্বরূপ, আইলিস (গাড়ি, 1, লেন (গাড়ি) -1) গাড়ি তালিকার প্রথম এবং শেষ আইটেম এড়িয়ে যাবে।
isliceদৈর্ঘ্য না জেনে বা একেবারে প্রয়োজনীয়তার চেয়ে আরও একবারে মেমরিতে আরও আইটেমগুলি সংরক্ষণ না করে যথেষ্ট ভালভাবে ব্যবহার করে যেকোন পুনরাবৃত্তির শুরুতে এবং / বা শেষে একটি নির্বিচার সংখ্যক আইটেম এড়িয়ে যাওয়া coversেকে দেন।
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আবার আবদ্ধ হতে পারে। এটা কেন তুমি করা উচিত নয় , বদলে করতে পারবে না , এটি ব্যবহার।
@ স্পেনমার্নচের জবাবের ভিত্তিতে, তবে কিছুটা সহজ এবং উপযুক্ত ব্যবহার ছাড়াই
>>> 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ফলাফলের ভিত্তিতে, এটি দ্রষ্টব্য সমাধানের তুলনায় সামান্য দ্রুত
>>> 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):
ঠিক আছে, আপনার সিনট্যাক্সটি শুরু করার জন্য আসলে পাইথন নয়।
পাইথন মধ্যে পুনরাবৃত্তিও একটি বাক্য গঠন, তিনি পাত্রে (অবশ্য টেকনিক্যালি এটা iterators শেষ) বিষয়বস্তু ধরে আছে 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। এই উদাহরণে এটি প্রথম প্রতিটি ব্যতীত আমি প্রতিটি উদাহরণে কিছু করব do