পাইথনে লুপের জন্য প্রথম এন্ট্রি এড়িয়ে যাবেন?


186

পাইথনে, আমি কীভাবে এমন কিছু করব:

for car in cars:
   # Skip first and last, do work for rest

4
আমি একটি নবাগত, কিন্তু আমি ব্যবহার করা হয় for n, i in enumerate(cars): if n!= 0: do something to i। যুক্তিটি হ'ল এটি প্রতিটি মানটিতে একটি 'কাউন্টার' যুক্ত করে যা আপনি তারপরে উদাহরণস্বরূপ লক্ষ্য করতে পারেন if n == some_value। এই উদাহরণে এটি প্রথম প্রতিটি ব্যতীত আমি প্রতিটি উদাহরণে কিছু করব do
ব্যবহারকারীর 1063287

উত্তর:


268

অন্যান্য উত্তরগুলি কেবল একটি অনুক্রমের জন্য কাজ করে।

যেকোন পুনরাবৃত্তির জন্য, প্রথম আইটেমটি এড়িয়ে যেতে:

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'

1
আরো দেখুন সেভেন Marnach এর উত্তর
agf

2
আমি দেখেছি কার.পপ (0) এবং কার.pop () ভাল কাজ করে।
স্বপ্নের কাজ 801

@ dreamwork801 আমার উত্তর এবং সোভেন, যা আমি প্রথম মন্তব্যে লিঙ্ক করেছি, যে কোনও পুনরাবৃত্তিযোগ্য এমনকি এমনকী অসীমদের জন্যও কাজ করে, কারণ পুনরাবৃত্তি শুরুর আগে তাদের ডেটাতে ও (এন) অপারেশন প্রয়োজন হয় না। আপনার পরামর্শ এবং অভিজিৎ দু'টিই কেবল সিক্যুয়েন্সের জন্য কাজ করে, কোনও পুনরাবৃত্তিযোগ্য নয়।
অগাস্ট

355

পাইথনে প্রথম উপাদানটি এড়াতে আপনি কেবল লিখতে পারেন

for car in cars[1:]:
    # Do What Ever you want

বা শেষ এলেম এড়িয়ে যেতে

for car in cars[:-1]:
    # Do What Ever you want

আপনি যে কোনও অনুক্রমের জন্য এই ধারণাটি ব্যবহার করতে পারেন।



2
মেমরির ব্যবহার সম্পর্কে কীভাবে? স্লাইস কি উপ-অনুক্রমের একটি নতুন অনুলিপি তৈরি করে?
ভয়েজার

@ ভয়েজার হ্যাঁ, এটি নতুন কপি তৈরি করে।
শ্রীনিবাস রেড্ডি থাটিপার্থি

27

প্রথম আইটেম (গুলি) এড়িয়ে যাওয়ার সর্বোত্তম উপায় হ'ল:

from itertools import islice
for car in islice(cars, 1, None):
    # do something

এই ক্ষেত্রে আইলিসটি 1-এর একটি সূচনা-পয়েন্ট এবং কোনওটির শেষ বিন্দুতে পুনরাবৃত্তি করা হয় যা পুনরাবৃত্তির শেষটি নির্দেশ করে।

পুনরাবৃত্তির শেষে আইটেমগুলি এড়াতে সক্ষম হতে আপনার দৈর্ঘ্যটি জানতে হবে (একটি তালিকার পক্ষে সর্বদা সম্ভব, তবে প্রয়োজনীয়তার জন্য যা আপনি পুনরাবৃত্তি করতে পারেন তা নয়)। উদাহরণস্বরূপ, আইলিস (গাড়ি, 1, লেন (গাড়ি) -1) গাড়ি তালিকার প্রথম এবং শেষ আইটেম এড়িয়ে যাবে।


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

সোভেনের উত্তরটি পুরো পুনরুক্তিটিকে মেমরির মধ্যে রাখবে - কালেকশনস.ডেক পুনরুক্তি দিয়ে চলবে। কালেকশন.ডেক (এক্সরেঞ্জ (10000000)) এর মতো কিছু করার চেষ্টা করুন। আপনি যদি প্রথম আইটেমটি এড়াতে চান তবে মেমরিতে সমস্ত
কক্ষ সংরক্ষণ করার দরকার নেই

2
একটি isliceযা dequeপুরো ট্রিটরেটরকে নয়, এটি প্রেরণ করা হয় এবং এটি শেষে এড়াতে আইটেমের সংখ্যার দৈর্ঘ্য। এটি পুরো পুনরুক্তিটিকে মেমরিতে সঞ্চয় করে না।
agf

26

এখানে একটি আরও সাধারণ জেনারেটর ফাংশন যা পুনরাবৃত্তযোগ্যের শুরু এবং শেষ থেকে যে কোনও আইটেমের সংখ্যা এড়িয়ে যায়:

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
agf

কালেকশন.ডেক (...) অবিলম্বে পুনরুক্তকারীর মধ্য দিয়ে যাবে। এর অর্থ স্কিপ (এক্সরেঞ্জ (10000000), 1) সত্যিকারের না হওয়া সত্ত্বেও প্রচুর স্মৃতি গ্রহণ করবে।
রই শেনবার্গ

4
@ রয় শেনবার্গ: skip(xrange(10000000), 1)ব্যবহার করবে at_end=0, সুতরাং প্যারামিটারটি deque()হবে islice(it, 0), যা কেবলমাত্র শূন্য উপাদান ব্যবহার করবে it। এটি প্রচুর স্মৃতি গ্রহণ করবে না।
সোভেন মারনাচ

8
for item in do_not_use_list_as_a_name[1:-1]:
    #...do whatever

3
listপরিবর্তনশীল নাম হিসাবে ব্যবহার করবেন না
অভিজিৎ

ওপি কেবল প্রথম উপাদানটি এড়িয়ে যেতে চায়। কেন: -1?
luke14free

6
এটি আসলে সংরক্ষিত নয় ; নামটি listআবার আবদ্ধ হতে পারে। এটা কেন তুমি করা উচিত নয় , বদলে করতে পারবে না , এটি ব্যবহার।
jscs

@ লুক ১৪ ফ্রি, প্রশ্নটি বলছে প্রথম উপাদানটি এড়িয়ে চলুন, তবে তার কোড মন্তব্য থেকেই বোঝা যায় যে তিনি সত্যই প্রথম এবং শেষ এড়তে চান।
জার্সিমাইক 20

@ লুকাক ১৪ ফ্রি শিরোনাম বলে, কোডের মধ্যে তিনি যা লিখেছেন তা নয়: "প্রথমে বা শেষ হলে এড়িয়ে যান"
কুর্জেডমেটাল

3

@ স্পেনমার্নচের জবাবের ভিত্তিতে, তবে কিছুটা সহজ এবং উপযুক্ত ব্যবহার ছাড়াই

>>> 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)
জাব্বারওয়াকি

3

উদাহরণ:

mylist=['one'.'two','three'.'four'.'five']
for i in mylist[1:]:
   print(i)

পাইথন সূচকটি 0 থেকে শুরু হয়, আমরা পুনরাবৃত্তিতে হেরফের করতে স্লাইসিং অপারেটরটি ব্যবহার করতে পারি।

for i in range(1,-1):

2

ঠিক আছে, আপনার সিনট্যাক্সটি শুরু করার জন্য আসলে পাইথন নয়।

পাইথন মধ্যে পুনরাবৃত্তিও একটি বাক্য গঠন, তিনি পাত্রে (অবশ্য টেকনিক্যালি এটা iterators শেষ) বিষয়বস্তু ধরে আছে for item in container। এই ক্ষেত্রে, ধারকটি carsতালিকার তালিকা, তবে আপনি প্রথম এবং শেষ উপাদানগুলি এড়াতে চান, যার অর্থ cars[1:-1](অজগর তালিকাগুলি শূন্য-ভিত্তিক, নেতিবাচক সংখ্যাগুলি শেষ থেকে গণনা করা হয় এবং :সিনট্যাক্সটি কাটছে।

তাহলে তুমি চাও

for c in cars[1:-1]:
    do something with c

4
এটি পুনরাবৃত্তযোগ্য (যেমন একটি জেনারেটর) দিয়ে কাজ করবে না, কেবল একটি ক্রম সহ।
রই শেনবার্গ

2

একটি বিকল্প পদ্ধতি:

for idx, car in enumerate(cars):
    # Skip first line.
    if not idx:
        continue
    # Skip last line.
    if idx + 1 == len(cars):
        continue
    # Real code here.
    print car

2

এখানে আমার পছন্দসই পছন্দ। এটি লুপে বেশি যোগ করার প্রয়োজন হয় না, এবং সরঞ্জামগুলিতে অন্তর্নির্মিত ছাড়া কিছুই ব্যবহার করে না।

থেকে যান:

for item in my_items:
  do_something(item)

প্রতি:

for i, item in enumerate(my_items):
  if i == 0:
    continue
  do_something(item)


1

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

0

আমি এটি এটি করি, যদিও এটি হ্যাকের মতো দেখা যায় যা এটি প্রতিবার কাজ করে:

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