সুতরাং আমি থেকে শুরু len(collection)
এবং শেষ করতে পারেন collection[0]
।
আমি লুপ সূচকটি অ্যাক্সেস করতে সক্ষম হতে চাই।
সুতরাং আমি থেকে শুরু len(collection)
এবং শেষ করতে পারেন collection[0]
।
আমি লুপ সূচকটি অ্যাক্সেস করতে সক্ষম হতে চাই।
উত্তর:
অন্তর্নির্মিত reversed()
ফাংশনটি ব্যবহার করুন :
>>> a = ["foo", "bar", "baz"]
>>> for i in reversed(a):
... print(i)
...
baz
bar
foo
মূল সূচকটি অ্যাক্সেস করতে enumerate()
, আপনার তালিকায় এটি দেওয়ার আগে ব্যবহার করুন reversed()
:
>>> for i, e in reversed(list(enumerate(a))):
... print(i, e)
...
2 baz
1 bar
0 foo
যেহেতু enumerate()
কোনও জেনারেটর এবং জেনারেটরগুলি ফেরত যায় না, তাই আপনাকে এটি list
প্রথমে রূপান্তর করতে হবে to
reversed()
তালিকাটি সংশোধন করবেন না। reversed()
তালিকার একটি অনুলিপি তৈরি করে না (অন্যথায় এটির জন্য ও (এন) অতিরিক্ত মেমরির প্রয়োজন হবে)। আপনার যদি প্রয়োজন তালিকাকে সংশোধন করতে alist.reverse()
; বিপরীত ক্রম ব্যবহারের জন্য যদি তালিকার একটি অনুলিপি আপনার প্রয়োজন হয় alist[::-1]
।
আপনি করতে পারেন:
for item in my_list[::-1]:
print item
(বা লুপের জন্য আপনি যা কিছু করতে চান তা করুন))
[::-1]
ফালি লুপ জন্য তালিকা reverses (কিন্তু আসলে আপনার তালিকা "স্থায়ীভাবে" এর সংশোধন করা হবে না)।
[::-1]
একটি অগভীর অনুলিপি তৈরি করে, সুতরাং এটি অ্যারে "স্থায়ীভাবে" বা "অস্থায়ী" পরিবর্তন করে না।
0
, সম্ভবত -1
, তাই শুরুতে প্রান্ত ) এবং পদক্ষেপ : -1
(তালিকার মাধ্যমে পিছনে পুনরাবৃত্তি, 1
একবারে আইটেম)।
reversed()
আপনার যদি লুপ সূচক প্রয়োজন হয় এবং পুরো তালিকাটি দু'বার অতিক্রম করতে চান না বা অতিরিক্ত মেমরি ব্যবহার করতে চান না তবে আমি একটি জেনারেটর লিখব।
def reverse_enum(L):
for index in reversed(xrange(len(L))):
yield index, L[index]
L = ['foo', 'bar', 'bas']
for index, item in reverse_enum(L):
print index, item
reversed(xrange(len(L)))
হিসাবে একই সূচক উত্পাদন করে xrange(len(L)-1, -1, -1)
।
for index, item in enumerate(reversed(L)): print len(L)-1-index, item
এটি এইভাবে করা যেতে পারে:
আমার সীমার জন্য (লেন (সংগ্রহ) -1, -1, -1): মুদ্রণ সংগ্রহ [i] অজগর 3 এর জন্য # মুদ্রণ (সংগ্রহ [i]) +
সুতরাং আপনার অনুমানটি খুব কাছাকাছি ছিল :) কিছুটা বিশ্রী তবে এটি মূলত বলেছে: এর চেয়ে কম 1 দিয়ে শুরু করুন len(collection)
, -1 এর ধাপে আপনি -1 এর আগে পৌঁছা পর্যন্ত চালিয়ে যান।
ফাই, help
ফাংশনটি খুব কার্যকর কারণ এটি আপনাকে পাইথন কনসোল থেকে ডকস দেখতে দেয় যেমন:
help(range)
-1
। আমি কেবল বলবreversed(xrange(len(collection)))
reversed
Builtin ফাংশন কুশলী হল:
for item in reversed(sequence):
ডকুমেন্টেশন বিপরীত তার সীমাবদ্ধতা ব্যাখ্যা করে।
যে সমস্ত ক্ষেত্রে আমাকে সূচির পাশাপাশি বিপরীতে ক্রম হাঁটাতে হবে (উদাহরণস্বরূপ স্থানের পরিবর্তনের জন্য অনুক্রমের দৈর্ঘ্য পরিবর্তন করা), আমি এই ফাংশনটি আমার কোডুটিল মডিউলটি সংজ্ঞায়িত করেছি:
import itertools
def reversed_enumerate(sequence):
return itertools.izip(
reversed(xrange(len(sequence))),
reversed(sequence),
)
এইটি সিকোয়েন্সের একটি অনুলিপি তৈরি করা এড়িয়ে চলে। স্পষ্টতই, reversed
সীমাবদ্ধতাগুলি এখনও প্রযোজ্য।
কোনও নতুন তালিকা পুনরায় তৈরি না করে কীভাবে, আপনি সূচীকরণের মাধ্যমে এটি করতে পারেন:
>>> foo = ['1a','2b','3c','4d']
>>> for i in range(len(foo)):
... print foo[-(i+1)]
...
4d
3c
2b
1a
>>>
অথবা
>>> length = len(foo)
>>> for i in range(length):
... print foo[length-i-1]
...
4d
3c
2b
1a
>>>
এছাড়াও, আপনি "পরিসর" বা "গণনা" ফাংশন ব্যবহার করতে পারেন। নিম্নরূপ:
a = ["foo", "bar", "baz"]
for i in range(len(a)-1, -1, -1):
print(i, a[i])
3 baz
2 bar
1 foo
আপনি নীচের হিসাবে ইটারটুলগুলি থেকে "গণনা" ব্যবহার করতে পারেন:
a = ["foo", "bar", "baz"]
from itertools import count, takewhile
def larger_than_0(x):
return x > 0
for x in takewhile(larger_than_0, count(3, -1)):
print(x, a[x-1])
3 baz
2 bar
1 foo
3 foo\n2 bar\n1 baz
list.reverse()
আপনি যেমনটি করেন তেমন ব্যবহার করুন এবং তারপরে পুনরাবৃত্তি করুন ।
reverse(enumerate(collection))
অজগর 3 এ অর্জনের একটি অভিব্যক্তিক উপায় :
zip(reversed(range(len(collection))), reversed(collection))
অজগর 2:
izip(reversed(xrange(len(collection))), reversed(collection))
আমি নিশ্চিত না কেন আমাদের এটির জন্য সংক্ষিপ্তকরণ নেই, যেমন:
def reversed_enumerate(collection):
return zip(reversed(range(len(collection))), reversed(collection))
বা কেন আমাদের নেই reversed_range()
আপনার যদি সূচকের প্রয়োজন হয় এবং আপনার তালিকাটি ছোট হয় তবে সর্বাধিক পঠনযোগ্য উপায় হ'ল reversed(list(enumerate(your_list)))
গৃহীত উত্তর হিসাবে বলে। কিন্তু এই আপনার তালিকার একটি কপি তৈরি করে, তাই যদি আপনার তালিকার আপনার মেমরি বৃহৎ অংশ নিচ্ছে আপনি সূচক দ্বারা ফিরে বিয়োগ করতে হবে enumerate(reversed())
থেকে len()-1
।
আপনার যদি কেবল একবার এটি করা দরকার:
a = ['b', 'd', 'c', 'a']
for index, value in enumerate(reversed(a)):
index = len(a)-1 - index
do_something(index, value)
বা যদি আপনাকে একাধিকবার এটি করা দরকার হয় তবে আপনার একটি জেনারেটর ব্যবহার করা উচিত:
def enumerate_reversed(lyst):
for index, value in enumerate(reversed(lyst)):
index = len(lyst)-1 - index
yield index, value
for index, value in enumerate_reversed(a):
do_something(index, value)
বিপরীত ফাংশন এখানে কাজে আসে:
myArray = [1,2,3,4]
myArray.reverse()
for x in myArray:
print x
লুপের জন্য আপনি কোনও সাধারণে নেতিবাচক সূচক ব্যবহার করতে পারেন:
>>> collection = ["ham", "spam", "eggs", "baked beans"]
>>> for i in range(1, len(collection) + 1):
... print(collection[-i])
...
baked beans
eggs
spam
ham
সূচকটি অ্যাক্সেস করতে যেমন আপনি সংগ্রহের বিপরীত অনুলিপিটি দিয়ে আগমন করছেন, ব্যবহার করুন i - 1
:
>>> for i in range(1, len(collection) + 1):
... print(i-1, collection[-i])
...
0 baked beans
1 eggs
2 spam
3 ham
মূল, বিপরীত সূচকগুলি অ্যাক্সেস করতে, ব্যবহার করুন len(collection) - i
:
>>> for i in range(1, len(collection) + 1):
... print(len(collection)-i, collection[-i])
...
3 baked beans
2 eggs
1 spam
0 ham
আমি মনে করি সবচেয়ে মার্জিত উপায় হ'ল নিম্নলিখিত জেনারেটরটি রূপান্তর করা enumerate
এবং reversed
ব্যবহার করা
(-(ri+1), val) for ri, val in enumerate(reversed(foo))
যা enumerate
পুনরাবৃত্তির বিপরীত উত্পন্ন করে
উদাহরণ:
foo = [1,2,3]
bar = [3,6,9]
[
bar[i] - val
for i, val in ((-(ri+1), val) for ri, val in enumerate(reversed(foo)))
]
ফলাফল:
[6, 4, 2]
অন্যান্য উত্তরগুলি ভাল, তবে আপনি তালিকা বোধগম্য শৈলী হিসাবে করতে চান
collection = ['a','b','c']
[item for item in reversed( collection ) ]
input_list = ['foo','bar','baz']
for i in range(-1,-len(input_list)-1,-1)
print(input_list[i])
আমার মনে হয় এটিও এটি করার সহজ উপায় ... শেষ থেকে পড়ুন এবং তালিকার দৈর্ঘ্য পর্যন্ত হ্রাস পেতে থাকবেন, যেহেতু আমরা কখনই "শেষ" সূচকটি কার্যকর করি না তাই -1 যোগ করাও
ধরে নেওয়া কাজটি হ'ল শেষ উপাদানটি অনুসন্ধান করা যা কোনও তালিকার কিছু শর্ত পূরণ করে (যেমন প্রথম দিকে পিছনের দিকে তাকালে), আমি নিম্নলিখিত সংখ্যাগুলি পেয়ে যাচ্ছি:
>>> min(timeit.repeat('for i in xrange(len(xs)-1,-1,-1):\n if 128 == xs[i]: break', setup='xs, n = range(256), 0', repeat=8))
4.6937971115112305
>>> min(timeit.repeat('for i in reversed(xrange(0, len(xs))):\n if 128 == xs[i]: break', setup='xs, n = range(256), 0', repeat=8))
4.809093952178955
>>> min(timeit.repeat('for i, x in enumerate(reversed(xs), 1):\n if 128 == x: break', setup='xs, n = range(256), 0', repeat=8))
4.931743860244751
>>> min(timeit.repeat('for i, x in enumerate(xs[::-1]):\n if 128 == x: break', setup='xs, n = range(256), 0', repeat=8))
5.548468112945557
>>> min(timeit.repeat('for i in xrange(len(xs), 0, -1):\n if 128 == xs[i - 1]: break', setup='xs, n = range(256), 0', repeat=8))
6.286104917526245
>>> min(timeit.repeat('i = len(xs)\nwhile 0 < i:\n i -= 1\n if 128 == xs[i]: break', setup='xs, n = range(256), 0', repeat=8))
8.384078979492188
সুতরাং, ugliest বিকল্পটি xrange(len(xs)-1,-1,-1)
দ্রুততম।