পাইথনে বিপরীত ক্রমে একটি তালিকা ঘুরে দেখুন


700

সুতরাং আমি থেকে শুরু len(collection)এবং শেষ করতে পারেন collection[0]

আমি লুপ সূচকটি অ্যাক্সেস করতে সক্ষম হতে চাই।

উত্তর:


1180

অন্তর্নির্মিত 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


130
কোনও অনুলিপি তৈরি হয় না, ট্র্যাভারিংয়ের সময় উপাদানগুলি উড়ে গিয়ে উল্টো হয়! এটি এই সমস্ত পুনরাবৃত্তি ফাংশনগুলির একটি গুরুত্বপূর্ণ বৈশিষ্ট্য (যা সমস্ত "এড" এ শেষ হয়)।
কনরাড রুডলফ

9
@ গ্রেগ হিউগিল নং, এটি মূলটির উপরে একটি পুনরাবৃত্তিকারী, কোনও অনুলিপি তৈরি করা হয়নি!
André

92
বিভ্রান্তি এড়াতে: reversed()তালিকাটি সংশোধন করবেন না। reversed()তালিকার একটি অনুলিপি তৈরি করে না (অন্যথায় এটির জন্য ও (এন) অতিরিক্ত মেমরির প্রয়োজন হবে)। আপনার যদি প্রয়োজন তালিকাকে সংশোধন করতে alist.reverse(); বিপরীত ক্রম ব্যবহারের জন্য যদি তালিকার একটি অনুলিপি আপনার প্রয়োজন হয় alist[::-1]
jfs

90
এই উত্তরে যদিও তালিকা দিন (গণনা করুন (ক)) একটি অনুলিপি তৈরি করুন।
ট্রিপটিচ

42
@ জেএফ, বিপরীত () একটি অনুলিপি তৈরি করে না, তবে তালিকা তৈরি করুন (গণনা করুন)) একটি অনুলিপি তৈরি করে।
ট্রিপটিচ

172

আপনি করতে পারেন:

for item in my_list[::-1]:
    print item

(বা লুপের জন্য আপনি যা কিছু করতে চান তা করুন))

[::-1]ফালি লুপ জন্য তালিকা reverses (কিন্তু আসলে আপনার তালিকা "স্থায়ীভাবে" এর সংশোধন করা হবে না)।


24
[::-1]একটি অগভীর অনুলিপি তৈরি করে, সুতরাং এটি অ্যারে "স্থায়ীভাবে" বা "অস্থায়ী" পরিবর্তন করে না।
jfs

6
এটি বিপরীত ব্যবহারের চেয়ে সামান্য ধীর, কমপক্ষে পাইথন ২.7 এর অধীনে (পরীক্ষিত)।
কেগ্রিফস

14
কিভাবে এই উত্তর কাজ : এটা পরামিতি সঙ্গে তালিকার একটি স্লাইসড কপি তৈরি করে শুরুর বিন্দু : অনির্দিষ্ট (তালিকা দৈর্ঘ্য হয়ে তাই শেষে শুরু হয়), শেষ বিন্দু : অনির্দিষ্ট (কিছু জাদু ছাড়া অন্য সংখ্যা হয়ে 0, সম্ভবত -1, তাই শুরুতে প্রান্ত ) এবং পদক্ষেপ : -1(তালিকার মাধ্যমে পিছনে পুনরাবৃত্তি, 1একবারে আইটেম)।
এডওয়ার্ড

1
আমি এটিও পরীক্ষা করেছি (পাইথন ২.7) এবং এটি ব্যবহারে এটি 10% reversed()
er

67

আপনার যদি লুপ সূচক প্রয়োজন হয় এবং পুরো তালিকাটি দু'বার অতিক্রম করতে চান না বা অতিরিক্ত মেমরি ব্যবহার করতে চান না তবে আমি একটি জেনারেটর লিখব।

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

3
আমি ফাংশনটিকে enumerate_reversed বলব, তবে এটি কেবল আমার স্বাদ হতে পারে। আমি বিশ্বাস করি আপনার উত্তরটি নির্দিষ্ট প্রশ্নের জন্য সবচেয়ে পরিষ্কার for
tzot

1
reversed(xrange(len(L)))হিসাবে একই সূচক উত্পাদন করে xrange(len(L)-1, -1, -1)
jfs

2
আমি বুঝতে কম চলন্ত অংশ পছন্দ করি:for index, item in enumerate(reversed(L)): print len(L)-1-index, item
ডন কার্কবি

2
@ ট্রিপটিচ আমাকে ঠিক এই মুহূর্তটি সহ্য করতে হয়েছিল যে বিপরীত () থেকে গণনা বিপরীত সূচকগুলি দেয় না এবং আপনার কোডটি অনেক সাহায্য করেছিল। এই পদ্ধতিটি স্ট্যান্ডার্ড লাইব্রেরিতে থাকা উচিত।
oski86

2
বিপরীত (এক্সরেঞ্জ ()) কাজ করে কারণ একটি এক্সরেঞ্জ অবজেক্টে __ রিভার্সড__ পদ্ধতি পাশাপাশি __len__ এবং __getitem__ পদ্ধতি রয়েছে এবং বিপরীতগুলি এটি সনাক্ত করতে পারে এবং সেগুলি ব্যবহার করতে পারে। তবে একটি গণনার অবজেক্টের __ রিভার্সড__, __len__ বা __getitem__ নেই। কিন্তু কেন তাদের গণনা করা হয় না? আমি জানি না।
ফিউচারনার্ড

60

এটি এইভাবে করা যেতে পারে:

আমার সীমার জন্য (লেন (সংগ্রহ) -1, -1, -1):
    মুদ্রণ সংগ্রহ [i]

    অজগর 3 এর জন্য # মুদ্রণ (সংগ্রহ [i]) +

সুতরাং আপনার অনুমানটি খুব কাছাকাছি ছিল :) কিছুটা বিশ্রী তবে এটি মূলত বলেছে: এর চেয়ে কম 1 দিয়ে শুরু করুন len(collection), -1 এর ধাপে আপনি -1 এর আগে পৌঁছা পর্যন্ত চালিয়ে যান।

ফাই, helpফাংশনটি খুব কার্যকর কারণ এটি আপনাকে পাইথন কনসোল থেকে ডকস দেখতে দেয় যেমন:

help(range)


1
পাইথনের সংস্করণগুলির জন্য 3.0 এর আগে, আমি বিশ্বাস করি যে এক্সরেঞ্জ বৃহত্তর লেন (সংগ্রহ) এর জন্য পরিসীমা তুলনায় বেশি ভাল।
ব্রায়ান এম হান্ট

আমি বিশ্বাস করি যে আপনি সঠিক বলেছেন :) প্রথম, পরিসর () পুরো অ্যারে হিসাবে অ্যারেঞ্জ তৈরি করে তবে এক্সরেঞ্জ () একটি পুনরাবৃত্তি প্রদান করে যা কেবলমাত্র প্রয়োজনীয় মানগুলি তৈরি করে।
অ্যালান রোয়ার্থ

11
এটি অনেকগুলি সাথে খুব অদ্ভুত দেখাচ্ছে -1। আমি কেবল বলবreversed(xrange(len(collection)))
মুসফিল 1

22

reversedBuiltin ফাংশন কুশলী হল:

for item in reversed(sequence):

ডকুমেন্টেশন বিপরীত তার সীমাবদ্ধতা ব্যাখ্যা করে।

যে সমস্ত ক্ষেত্রে আমাকে সূচির পাশাপাশি বিপরীতে ক্রম হাঁটাতে হবে (উদাহরণস্বরূপ স্থানের পরিবর্তনের জন্য অনুক্রমের দৈর্ঘ্য পরিবর্তন করা), আমি এই ফাংশনটি আমার কোডুটিল মডিউলটি সংজ্ঞায়িত করেছি:

import itertools
def reversed_enumerate(sequence):
    return itertools.izip(
        reversed(xrange(len(sequence))),
        reversed(sequence),
    )

এইটি সিকোয়েন্সের একটি অনুলিপি তৈরি করা এড়িয়ে চলে। স্পষ্টতই, reversedসীমাবদ্ধতাগুলি এখনও প্রযোজ্য।


9

কোনও নতুন তালিকা পুনরায় তৈরি না করে কীভাবে, আপনি সূচীকরণের মাধ্যমে এটি করতে পারেন:

>>> 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
>>>


7

আমি ওয়ান-লাইনার জেনারেটর পদ্ধতির পছন্দ করি:

((i, sequence[i]) for i in reversed(xrange(len(sequence))))

7

এছাড়াও, আপনি "পরিসর" বা "গণনা" ফাংশন ব্যবহার করতে পারেন। নিম্নরূপ:

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
amiller27

প্রথম উদাহরণে "a [i-1]" ব্যবহার এড়াতে এই ব্যাপ্তিটি "ব্যাপ্তি (লেন (এ) -1, -1, -1)" ব্যবহার করুন। এটি আরও সরল।
ফ্রান্সিস্ক


4

কোনও আমদানি ছাড়াই একটি পদ্ধতি:

for i in range(1,len(arr)+1):
    print(arr[-i])

অথবা

for i in arr[::-1]:
    print(i)


3

আপনি যা করতে পারেন তার জন্য আপনি এটিও এটি করতে পারেন। খুব সহজ.

a = [1, 2, 3, 4, 5, 6, 7]
for x in xrange(len(a)):
    x += 1
    print a[-x]

1
আপনি এটি করতে এবং print a[-(x+1)]লুপের মুখ্য অংশে সূচকটি পুনরায় নিয়োগ এড়াতে পারেন ।
ম্যালকম

2

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()


2

আপনার যদি সূচকের প্রয়োজন হয় এবং আপনার তালিকাটি ছোট হয় তবে সর্বাধিক পঠনযোগ্য উপায় হ'ল 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)

1

বিপরীত ফাংশন এখানে কাজে আসে:

myArray = [1,2,3,4]
myArray.reverse()
for x in myArray:
    print x

list.revers () এর কোনও রিটার্নের মান নেই
জর্জি স্কলি

1

আপনি একটি whileলুপ ব্যবহার করতে পারেন :

i = len(collection)-1
while i>=0:
    value = collection[i]
    index = i
    i-=1

1

লুপের জন্য আপনি কোনও সাধারণে নেতিবাচক সূচক ব্যবহার করতে পারেন:

>>> 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

1

আপনি যদি সূচকটিকে নেতিবাচক বলে মনে করেন না তবে আপনি এটি করতে পারেন:

>>> a = ["foo", "bar", "baz"]
>>> for i in range(len(a)):
...     print(~i, a[~i]))
-1 baz
-2 bar
-3 foo

1

আমি মনে করি সবচেয়ে মার্জিত উপায় হ'ল নিম্নলিখিত জেনারেটরটি রূপান্তর করা 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]

0

অন্যান্য উত্তরগুলি ভাল, তবে আপনি তালিকা বোধগম্য শৈলী হিসাবে করতে চান

collection = ['a','b','c']
[item for item in reversed( collection ) ]

1
এটি কি ঠিক বিপরীত (সংগ্রহ) এর মতো নয়? তালিকার বোধগম্যতা যুক্ত করা অপ্রয়োজনীয় গণনা ব্যতীত কিছুই করে না। এটি [= 1, 2, 3] বনাম a [[1, 2, 3]] আইটেমের জন্য আইটেম লিখার মতো।
এপিকডাভি

0

নেতিবাচক সূচকগুলি ব্যবহার করতে: -1 থেকে শুরু করুন এবং প্রতিটি পুনরাবৃত্তিতে -1 দ্বারা ফিরে যান।

>>> a = ["foo", "bar", "baz"]
>>> for i in range(-1, -1*(len(a)+1), -1):
...     print i, a[i]
... 
-1 baz
-2 bar
-3 foo

0

একটি সহজ উপায়:

n = int(input())
arr = list(map(int, input().split()))

for i in reversed(range(0, n)):
    print("%d %d" %(i, arr[i]))

0
input_list = ['foo','bar','baz']
for i in range(-1,-len(input_list)-1,-1)
    print(input_list[i])

আমার মনে হয় এটিও এটি করার সহজ উপায় ... শেষ থেকে পড়ুন এবং তালিকার দৈর্ঘ্য পর্যন্ত হ্রাস পেতে থাকবেন, যেহেতু আমরা কখনই "শেষ" সূচকটি কার্যকর করি না তাই -1 যোগ করাও


0

ধরে নেওয়া কাজটি হ'ল শেষ উপাদানটি অনুসন্ধান করা যা কোনও তালিকার কিছু শর্ত পূরণ করে (যেমন প্রথম দিকে পিছনের দিকে তাকালে), আমি নিম্নলিখিত সংখ্যাগুলি পেয়ে যাচ্ছি:

>>> 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)দ্রুততম।


-1

আপনি একটি জেনারেটর ব্যবহার করতে পারেন:

li = [1,2,3,4,5,6]
len_li = len(li)
gen = (len_li-1-i for i in range(len_li))

পরিশেষে:

for i in gen:
    print(li[i])

আশা করি এটি আপনাকে সাহায্য করবে

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