কোনও তালিকার শেষ আইটেম ছাড়া কীভাবে লুপ করবেন?


160

আমি প্রতিটি আইটেম অনুসরণ করে তার বিপরীতে একটি তালিকা পরীক্ষা করে লুপ করতে চাই।

এক্স এর জন্য y ব্যবহার করে শেষ আইটেমটি বাদ দিয়ে আমি কী সমস্ত উপায় লুপ করতে পারি? আমি চাইলে সূচি ব্যবহার না করেই এটি করতে পছন্দ করব।

বিঃদ্রঃ

ফ্রিস্পেস আমার প্রকৃত প্রশ্নের উত্তর দিয়েছে, যার কারণেই আমি উত্তরটি গ্রহণ করেছি, তবে সাইলেন্টগোস্ট আমার জিজ্ঞাসা করা প্রশ্নটির উত্তর দিয়েছেন।

বিভ্রান্তির জন্য দুঃখিত।

উত্তর:


316
for x in y[:-1]

যদি yজেনারেটর হয় তবে উপরেরটি কাজ করবে না।


এটি আমার প্রশ্নের উত্তর দেয়, ধন্যবাদ, তবে আমি এক্স এর পরে কীভাবে আইটেমটি পাব তা জিজ্ঞাসা করতে ভুলে গিয়েছিলাম। এটা কি সম্ভব?
ডেভিড সাইকস

3
- 1 আমি মনে করি না যে প্রশ্নের উত্তর। এটি প্রতিটি আইটেমের পরেরটির সাথে তুলনা করে না। - ওডব্লিউ 0 সেকেন্ড আগে
বিজয়

4
আমার মনে হয় আমি করেছি। লেখক বলেছেন, তিনি যা করতে এক্স চাই, তারপর জিজ্ঞাসা কীভাবে তিনি ওয়াই আমি উত্তর দিলাম সে ওয়াই না কিভাবে করতে তিনি আমার উত্তর নির্দেশ করবে আমি প্রশ্ন তিনি জিজ্ঞেস বললেন, যদি না প্রশ্ন তিনি গৃহীত তা করতে পারে সত্যিই জিজ্ঞাসা করতে চেয়েছিলেন। প্রশ্নকর্তা এই উত্তরটি হ্রাস করতে স্বাগত।
ফ্রিস্পেস

7
ওপিকে প্রথমে অন্য একটি প্রশ্ন জিজ্ঞাসা করা উচিত ছিল, তার মানে এই নয় যে তার প্রশ্ন এবং এই উত্তরটি অন্যদের পক্ষে খুব কার্যকর নয়। +1
অধ্যাপক ফ্যালকেন

1
আপনি উল্লেখ করেছেন যে এটি জেনারেটরের পক্ষে কাজ করে না। yজেনারেটর যখন হয় বিকল্প কি ?
জুস্ট

50

সিকোয়েন্স আইটেমটি নিম্নলিখিতগুলির সাথে তুলনা করার সবচেয়ে সহজ উপায়:

for i, j in zip(a, a[1:]):
     # compare i (the current) to j (the following)

15
এটি আমি যে প্রশ্নটি চেয়েছিলাম তার উত্তর দেয়। ধন্যবাদ
ডেভিড সাইকস

3
প্রকৃতপক্ষে, আপনি প্রথম স্লাইস বাদ দিতে পারেন, যেহেতু জিপ সংক্ষিপ্ত দৈর্ঘ্যের জন্য দীর্ঘ তালিকাটি কেটে দেয়। এটি আপনাকে একটি তালিকা তৈরির সংরক্ষণ করবে। (কেবলমাত্র যদি আপনি বিশাল তালিকাগুলির সাথে লেনদেন করছেন, তবে সেই ক্ষেত্রে আপনার আন্টস আসমার পন্থা অনুসরণ করা উচিত, যা কোনও কিছুই অনুলিপি করে না))
বায়ার

19

আপনি যদি সিকোয়েন্স জোড় অনুসারে সমস্ত উপাদান পেতে চান তবে এই পদ্ধতির ব্যবহার করুন (পেয়ারওয়াইজ ফাংশনটি ইটারটোলস মডিউলটির উদাহরণগুলি থেকে)।

from itertools import tee, izip, chain

def pairwise(seq):
    a,b = tee(seq)
    b.next()
    return izip(a,b)

for current_item, next_item in pairwise(y):
    if compare(current_item, next_item):
        # do what you have to do

আপনার যদি শেষের মানটিকে কিছু বিশেষ মানের সাথে তুলনা করতে হয় তবে সেই মানটি শেষ পর্যন্ত চেইন করুন

for current, next_item in pairwise(chain(y, [None])):

দয়া করে মনে রাখবেন, অন্তর্নির্মিত চলক নামের ছায়ার জন্য পরবর্তী ব্যবহার
সাইলেন্টগোস্ট

1
যখন ভেরিয়েবলের পরিধি ছোট হয় এবং নামটি পাঠযোগ্যতার জন্য ভাল হয় তখন আমি ব্যক্তিগতভাবে কম ব্যবহৃত বিল্টিনগুলি ছায়া নেওয়ার বিষয়ে কিছু মনে করি না। তবুও ভাল কোডিং অনুশীলন বজায় রাখতে পরিবর্তনশীল নামগুলি সম্পাদনা করা হয়েছে।
আন্টস আসমা

5

আপনি যদি তালিকার n + 1 ম আইটেমের সাথে nth আইটেমটির তুলনা করতে চান তবে আপনি এটি করতেও পারেন

>>> for i in range(len(list[:-1])):
...     print list[i]>list[i+1]

মনে রাখবেন যে সেখানে কোনও হার্ড কোডিং চলছে না। যদি আপনি অন্যথায় অনুভব না করেন তবে এটি ঠিক করা উচিত।


3
তালিকার অনুলিপি এড়াতে আপনি লেন (তালিকা [: - 1]) এর পরিবর্তে লেন (তালিকা) - 1 দিয়ে দিতে পারেন। এবং ভেরিয়েবল নামক তালিকাটি ব্যবহার করা এড়িয়ে চলুন ...
রেমি ব্ল্যাঙ্ক

2

কোনও তালিকা তাত্ক্ষণিক না করে পুনরুক্তিতে প্রতিটি আইটেমের সাথে পরবর্তীটির সাথে তুলনা করতে:

import itertools
it = (x for x in range(10))
data1, data2 = itertools.tee(it)
data2.next()
for a, b in itertools.izip(data1, data2):
  print a, b

2
যে ঠিক কী পিঁপড়া Aasma দ্বারা প্রস্তাব ছিল stackoverflow.com/questions/914715/...
SilentGhost

1

এটি ওএপিকে যা জিজ্ঞাসা করা উচিত ছিল তার জবাব দেয় , অর্থাত্ ক্রমাগত উপাদানগুলির তুলনায় একটি তালিকা ( সর্বোপরি সাইলেন্টগোস্ট উত্তর), তবে যে কোনও গ্রুপের ( এন-গ্রাম ) জন্য সাধারণীকরণ করা হয়েছে : 2, 3, ... n:

zip(*(l[start:] for start in range(0, n)))

উদাহরণ:

l = range(0, 4)  # [0, 1, 2, 3]

list(zip(*(l[start:] for start in range(0, 2)))) # == [(0, 1), (1, 2), (2, 3)]
list(zip(*(l[start:] for start in range(0, 3)))) # == [(0, 1, 2), (1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 4)))) # == [(0, 1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 5)))) # == []

ব্যাখ্যা:

  • l[start:] সূচি থেকে শুরু করে এএ তালিকা / জেনারেটর উত্পন্ন করে start
  • *listবা *generator: সমস্ত উপাদানগুলি এনকোলেজিং ফাংশনে পাস করে zipযেন এটি লেখা হয়েছিলzip(elem1, elem2, ...)

বিঃদ্রঃ:

আফাইক, এই কোডটি যতটা হতে পারে তত অলস। পরীক্ষিত না.

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