python - 'জন্য' loops মধ্যে সূচক অ্যাক্সেস?




list (14)

নীচের তালিকার জন্য আমি কিভাবে সূচী নিজেই অ্যাক্সেস করব?

ints = [8, 23, 45, 12, 78]

যখন আমি লুপের for এটি ব্যবহার করে লুপ করি, আমি এই ক্ষেত্রে লুপ সূচকটি কীভাবে 1 থেকে 5 পর্যন্ত অ্যাক্সেস করতে পারি?


একটি লুপ ব্যবহার করে, আমি কিভাবে এই ক্ষেত্রে 1 থেকে 5 লুপ সূচক অ্যাক্সেস করতে পারি?

আপনি পুনরাবৃত্তি হিসাবে উপাদান সঙ্গে সূচক পেতে enumerate ব্যবহার করুন:

for index, item in enumerate(items):
    print(index, item)

এবং নোট করুন যে পাইথনের সূচী শূন্যে শুরু হয়েছে, তাই আপনি উপরে দিয়ে 0 থেকে 4 পাবেন। যদি আপনি গণনা করতে চান, 1 থেকে 5, এটি করুন:

for count, item in enumerate(items, start=1):
    print(count, item)

Unidiomatic নিয়ন্ত্রণ প্রবাহ

আপনি যা জিজ্ঞাসা করছেন তা হল নিম্নলিখিতগুলির পাইথনিক সমতুল্য, যা আলগোরিদিম নিম্ন স্তরের ভাষাগুলির অধিকাংশ প্রোগ্রামার ব্যবহার করবে:

index = 0            # Python's indexing starts at zero
for item in items:   # Python's for loops are a "for each" loop 
    print(index, item)
    index += 1

অথবা এমন ভাষাগুলিতে যা প্রতিটি লুপের জন্য নয়:

index = 0
while index < len(items):
    print(index, items[index])
    index += 1

বা কখনও কখনও আরো সাধারণ (কিন্তু unidiomatically) পাইথন পাওয়া যায়:

for index in range(len(items)):
    print(index, items[index])

গাণিতিক ফাংশন ব্যবহার করুন

পাইথন এর enumerate ফাংশন সূচীগুলির জন্য অ্যাকাউন্টিং লুকিয়ে, এবং পুনরাবৃত্তিকে অন্য পুনর্নবীকরণযোগ্য (একটি সংখ্যাসূচক বস্তু) ধারণ করে ভিজ্যুয়াল ক্লাটারকে হ্রাস করে, যা সূচকের দুটি আইটেমের টিপল এবং মূল পুনরাবৃত্তি প্রদানকারী আইটেমটি সরবরাহ করে। যে এই মত দেখায়:

for index, item in enumerate(items, start=0):   # default is zero
    print(index, item)

এই কোড নমুনাটি পাইথন এবং কোড নয় যা কোডের মধ্যে পার্থক্য কোডের মধ্যে পার্থক্যের canonical উদাহরণটি মোটামুটি ভাল। আইডিয়োমেটিক কোডটি জটিল (তবে জটিল নয়) পাইথন, এটি ব্যবহার করা হয়েছে এমন ভাবে লেখা হয়েছে। Idiomatic কোড ভাষা ডিজাইনার দ্বারা প্রত্যাশিত হয়, যার মানে সাধারণত এই কোডটি শুধুমাত্র আরো পঠনযোগ্য নয়, আরো দক্ষ।

একটি গণনা পেয়ে

এমনকি যদি আপনি সূচীগুলির প্রয়োজন হয় না তবেও আপনি পুনরাবৃত্তিগুলির গণনা প্রয়োজন (কখনও কখনও পছন্দসই) আপনি 1 দিয়ে শুরু করতে পারেন এবং চূড়ান্ত সংখ্যা আপনার গণনা হবে।

for count, item in enumerate(items, start=1):   # default is zero
    print(item)

print('there were {0} items printed'.format(count))

আপনি যদি 1 থেকে 5 চেয়েছিলেন বলে গণনা করেন তবে গণনাটি আরও বেশি বলে মনে হয় (যেমন সূচক হিসাবে)।

এটা ভেঙ্গে - ধাপে ব্যাখ্যা দ্বারা একটি ধাপ

এই উদাহরণগুলি ভাঙার জন্য, আমাদের কাছে এমন আইটেমগুলির একটি তালিকা আছে যা আমরা সূচকের সাথে পুনরাবৃত্তি করতে চাই:

items = ['a', 'b', 'c', 'd', 'e']

এখন আমরা একটি enumerate বস্তু তৈরি, enumerate এই পুনরাবৃত্তি পাস:

enumerate_object = enumerate(items) # the enumerate object

আমরা এই আইটেমটি থেকে প্রথম আইটেমটি টেনে আনতে পারি যা আমরা next ফাংশনের সাথে একটি লুপে পেতে পারি:

iteration = next(enumerate_object) # first iteration from enumerate
print(iteration)

এবং আমরা দেখি আমরা 0 , প্রথম সূচী এবং 'a' এর একটি টিপেল পাই, প্রথম আইটেমটি:

(0, 'a')

আমরা এই দুটি টুপি থেকে উপাদানগুলি বের করতে " ক্রম আনপ্যাকিং " হিসাবে উল্লেখ করা যেতে পারে:

index, item = iteration
#   0,  'a' = (0, 'a') # essentially this.

এবং যখন আমরা index পরিদর্শন করি, আমরা এটি প্রথম সূচী, 0, এবং item বোঝায় তা প্রথম আইটেমটি 'a' বোঝায়।

>>> print(index)
0
>>> print(item)
a

উপসংহার

  • পাইথন সূচক শূন্য শুরু
  • আপনি এই পুনরাবৃত্তি হিসাবে একটি পুনরাবৃত্তি থেকে এই সূচী পেতে, enumerate ফাংশন ব্যবহার করুন
  • Idiomatic ভাবে enumerate ব্যবহার করে (tuple unpacking বরাবর) আরও পাঠযোগ্য এবং রক্ষণযোগ্য কোড তৈরি করে:

তাই এটি করুন:

for index, item in enumerate(items, start=0):   # Python indexes start at zero
    print(index, item)

অতিরিক্ত রাষ্ট্র পরিবর্তনশীল ব্যবহার করে, যেমন সূচী পরিবর্তনশীল (যা আপনি সাধারণত সি বা পিএইচপি হিসাবে ব্যবহার করবেন), অ-পাইথনিক হিসাবে বিবেচিত হয়।

উন্নত বিকল্প হল বিল্ট-ইন ফাংশন enumerate() , পাইথন 2 এবং 3 উভয়তে উপলব্ধ:

for idx, val in enumerate(ints):
    print(idx, val)

আরো জন্য PEP 279 দেখুন।


আপনি enumerate ব্যাখ্যা ব্যাখ্যা একটি সংখ্যা পেয়েছেন, কিন্তু যদি আপনি শুধুমাত্র দুটি তালিকাতে মিলিং এন্ট্রি অ্যাক্সেস করার জন্য সূচক প্রয়োজন, পাইথন 3: zip মধ্যে আরও পরিষ্কার এবং সহজ উপায় আরেকটি উপায় আছে।

উদাহরণস্বরূপ, যদি আপনি আপনার তালিকার সংখ্যাগুলির জন্য সংশ্লিষ্ট নামগুলি টেনে আনতে সূচী ব্যবহার করেন তবে আপনি এটি এমনভাবে করতে পারেন:

ints = [8, 23, 45, 12, 78]
names = ["John", "Sue", "Johannes", "Patel", "Ian"]
for int, name = zip(ints, names):
    print("{} - {}".format(name, int)

যে উত্পাদন হবে

8 - John
23 - Sue
45 - Johannes
12 - Patel
78 - Ian

আপনি index পদ্ধতি ব্যবহার করতে পারেন

ints = [8, 23, 45, 12, 78]
inds = [ints.index(i) for i in ints]

ইটগুলিতে ডুপ্লিকেটগুলি থাকলে এই পদ্ধতিটি কাজ করে না এমন মন্তব্যটিতে হাইলাইট করুন, নীচের পদ্ধতিটি ints যেকোন মানগুলির জন্য কাজ করা উচিত:

ints = [8, 8, 8, 23, 45, 12, 78]
inds = [tup[0] for tup in enumerate(ints)]

অথবা বিকল্পভাবে

ints = [8, 8, 8, 23, 45, 12, 78]
inds = [tup for tup in enumerate(ints)]

আপনি যদি tuples একটি তালিকা হিসাবে ইনস মধ্যে সূচক এবং মান উভয় পেতে চান।

এটি এই প্রশ্নের নির্বাচিত উত্তরগুলির enumerate পদ্ধতি ব্যবহার করে, তবে তালিকা বোঝার সাথে এটি কম কোড সহ দ্রুততর করে।


আপনি এটি চেষ্টা করতে পারেন:

data = ['itemA.ABC', 'itemB.defg', 'itemC.drug', 'itemD.ashok']
x = []
for (i, item) in enumerate(data):
      a = (i, str(item).split('.'))
      x.append(a)
for index, value in x:
     print(index, value)

আউটপুট হয়

0 ['itemA', 'ABC']
1 ['itemB', 'defg']
2 ['itemC', 'drug']
3 ['itemD', 'ashok']

আমি nums = পুনরাবৃত্তি = [1,2,3,4,5] আমি করতে হবে

for i, num in enumerate(nums, start = 1):
    print(i, num)

অথবা ল = লেন (nums) হিসাবে দৈর্ঘ্য পেতে

for i, num in range(1, l + 1):
    print(i, nums[i])

এই আলোচনা অনুসারে: http://bytes.com/topic/python/answers/464012-objects-list-index

লুপ কাউন্টার পুনরাবৃত্তি

সূচকের উপর looping জন্য বর্তমান idiom অন্তর্নির্মিত 'পরিসীমা' ফাংশন ব্যবহার করে তোলে:

for i in range(len(sequence)):
    # work with index i

উভয় উপাদান এবং সূচকগুলির উপর লুপিং পুরানো মূদ্রা দ্বারা বা নতুন 'জিপ' অন্তর্নির্মিত ফাংশনটি ব্যবহার করে অর্জন করা যেতে পারে [2]:

for i in range(len(sequence)):
    e = sequence[i]
    # work with index i and element e

অথবা

for i, e in zip(range(len(sequence)), sequence):
    # work with index i and element e

http://www.python.org/dev/peps/pep-0212/ মাধ্যমে


এই উদ্দেশ্য যথেষ্ট ভাল কাজ করে:

list1 = [10, 'sumit', 43.21, 'kumar', '43', 'test', 3]
for x in list1:
    print('index:', list1.index(x), 'value:', x)

তালিকাতে কোন সদৃশ মান নেই:

for i in ints:
        indx=ints.index(i)
        print(i,indx)

পরিবর্তে enumerate. ব্যবহার করুন enumerate.

for counter, value in enumerate(ints):
    print(counter, value)

অথবা নীচে ব্যবহার করুন:

for counter in range(len(ints)):
    print(counter,ints[counter])

পাইথন আদর্শ হিসাবে এটি করার বিভিন্ন উপায় আছে। সব উদাহরণ অনুমান করুন: lst = [1, 2, 3, 4, 5]

1. enumerate ব্যবহার করে ( বেশিরভাগ idiomatic বিবেচিত )

for index, element in enumerate(lst):
    # do the things that need doing here

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

2. সূচী ধরে রাখতে একটি পরিবর্তনশীল তৈরি ( for ব্যবহার )

for index in range(len(lst)):   # or xrange
    # you will have to write extra code to get the element

3. সূচী ধরে রাখতে একটি পরিবর্তনশীল তৈরি ( while ব্যবহার while )

index = 0
while index < len(lst):
    # you will have to write extra code to get the element
    index += 1  # escape infinite recursion

4. অন্য উপায় সবসময় আছে

আগে ব্যাখ্যা করা হয়েছে, এমন কিছু করার উপায় রয়েছে যা এখানে ব্যাখ্যা করা হয়নি এবং তারা অন্যান্য পরিস্থিতিতে আরও প্রয়োগ করতে পারে। উদাহরণস্বরূপ itertools.chain ব্যবহার করে। এটি নেস্টেড loops অন্যান্য উদাহরণের চেয়ে ভাল পরিচালনা করে।


প্রথম সব, সূচী 0 থেকে 4. হবে প্রোগ্রামিং প্রোগ্রামিং 0 থেকে গণনা শুরু; যে ভুলবেন না বা আপনি সীমানা ব্যতিক্রম বাইরে একটি সূচক জুড়ে আসতে হবে। আপনি লুপ জন্য প্রয়োজন সব একটি পরিবর্তনশীল 0 থেকে 4 তাই গণনা করা হয়:

for x in range(0, 5):

মনে রাখবেন যে আমি 0 থেকে 5 লিখেছি কারণ লুপ সর্বাধিক আগে এক নম্বর বন্ধ করে দেয়। :)

একটি সূচক ব্যবহারের মান পেতে

list[index]

লুপের for তালিকা ব্যবহার করে তালিকা বোঝার তালিকার (সূচী, মান) মুদ্রণ করতে:

ints = [8, 23, 45, 12, 78]
print [(i,ints[i]) for i in range(len(ints))]

আউটপুট:

[(0, 8), (1, 23), (2, 45), (3, 12), (4, 78)]

পাইথন 2.7 এ লুপের তালিকার সূচীগুলি অ্যাক্সেস করার দ্রুততম উপায় ছোট তালিকাগুলির জন্য পরিসীমা পদ্ধতি এবং মাঝারি এবং বিশাল আকার তালিকাগুলির জন্য এনমারেট পদ্ধতি ব্যবহার করা।

দয়া করে নীচের কোড নমুনাগুলিতে তালিকা এবং অ্যাক্সেস সূচক মান এবং তাদের কর্মক্ষমতা মেট্রিকগুলি (যা আমি মনে করি আপনার জন্য উপকারী হবে) উপর পুনরাবৃত্তি করতে ব্যবহার করা যেতে পারে এমন বিভিন্ন পদ্ধতির দেখুন:

from timeit import timeit

# Using range
def range_loop(iterable):
    for i in range(len(iterable)):
        1 + iterable[i]

# Using xrange
def xrange_loop(iterable):
    for i in xrange(len(iterable)):
        1 + iterable[i]

# Using enumerate
def enumerate_loop(iterable):
    for i, val in enumerate(iterable):
        1 + val

# Manual indexing
def manual_indexing_loop(iterable):
    index = 0
    for item in iterable:
        1 + item
        index += 1

নীচের প্রতিটি পদ্ধতির জন্য কর্মক্ষমতা মেট্রিক দেখুন:

from timeit import timeit

def measure(l, number=10000):
print "Measure speed for list with %d items" % len(l)
print "xrange: ", timeit(lambda :xrange_loop(l), number=number)
print "range: ", timeit(lambda :range_loop(l), number=number)
print "enumerate: ", timeit(lambda :enumerate_loop(l), number=number)
print "manual_indexing: ", timeit(lambda :manual_indexing_loop(l), number=number)

measure(range(1000))
# Measure speed for list with 1000 items
# xrange:  0.758321046829
# range:  0.701184988022
# enumerate:  0.724966049194
# manual_indexing:  0.894635915756

measure(range(10000))
# Measure speed for list with 100000 items
# xrange:  81.4756360054
# range:  75.0172479153
# enumerate:  74.687623024
# manual_indexing:  91.6308541298

measure(range(10000000), number=100)
# Measure speed for list with 10000000 items
# xrange:  82.267786026
# range:  84.0493988991
# enumerate:  78.0344707966
# manual_indexing:  95.0491430759

ফলস্বরূপ, range পদ্ধতি ব্যবহার করে 1000 আইটেমের সাথে তালিকায় দ্রুততরতম। আকারের তালিকার জন্য> 10 000 টি আইটেম enumerate বিজয়ী।

নীচের কিছু দরকারী লিঙ্ক যোগ করা হচ্ছে:


for i in range(len(ints)):
   print i, ints[i]






list