जवाबों:
अंतर्निहित 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
पहले बदलने की जरूरत है ।
reversed()
सूची को संशोधित नहीं करता है। reversed()
सूची की एक प्रति नहीं बनाता है (अन्यथा इसे ओ (एन) अतिरिक्त मेमोरी की आवश्यकता होगी)। यदि आपको सूची उपयोग को संशोधित करने की आवश्यकता है alist.reverse()
; यदि आपको उल्टे क्रम के उपयोग में सूची की एक प्रति चाहिए alist[::-1]
।
तुम कर सकते हो:
for item in my_list[::-1]:
print item
(या आप जो कुछ भी करना चाहते हैं लूप में करें।)
[::-1]
टुकड़ा पाश के लिए में सूची पराजयों (लेकिन वास्तव में अपनी सूची "स्थायी रूप से" संशोधित नहीं होगा)।
[::-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] अजगर के लिए # प्रिंट (संग्रह [i]) + +
तो आपका अनुमान बहुत करीब था :) थोड़ा अजीब है, लेकिन यह मूल रूप से कह रहा है: 1 से कम से शुरू करें len(collection)
, जब तक आप -1 से पहले नहीं मिलते, तब तक चलते रहें।
Fyi, 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
सीमाएं अभी भी लागू होती हैं।
इसके अलावा, आप या तो "रेंज" या "गणना" फ़ंक्शन का उपयोग कर सकते हैं। निम्नलिखित नुसार:
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
तो, कुरकुरा विकल्प xrange(len(xs)-1,-1,-1)
सबसे तेज है।