පයිතන් හි ලැයිස්තුවක් ආපසු හරවන්නේ කෙසේද?


1054

පයිතන් හි පහත සඳහන් දෑ කරන්නේ කෙසේද?

array = [0, 10, 20, 40]
for (i = array.length() - 1; i >= 0; i--)

මට අරාවෙහි මූලද්රව්ය තිබිය යුතුය, නමුත් අවසානයේ සිට ආරම්භය දක්වා.

Answers:


1337

මේ සඳහා ඔබට reversedශ්‍රිතය භාවිතා කළ හැකිය :

>>> array=[0,10,20,40]
>>> for i in reversed(array):
...     print(i)

reversed(...)ලැයිස්තුවක් ආපසු නොදෙන සටහන . භාවිතයෙන් ඔබට ප්‍රතිලෝම ලැයිස්තුවක් ලබා ගත හැකිය list(reversed(array)).


199
ඔබට භාවිතා කළ නොහැක: අරාව [:: - 1]?
kdlannoy

139
dkdlannoy පිළිතුරට සම්බන්ධ කර ඇති පිටුවට අනුව, “පරාසය (1,4) [:: - 1] වැනි දිගු කළ පෙති වලට සාපේක්ෂව, ආපසු හැරවීම () කියවීමට පහසුය, වේගයෙන් ධාවනය වන අතර සැලකිය යුතු ලෙස අඩු මතකයක් භාවිතා කරයි. "
ජිම් ඕල්ඩ්ෆීල්ඩ්

5
මා පරීක්ෂා කරන විට මෙම පෙති කැපීම දෙගුණයක් පමණ වේගවත් විය (10k මූලද්‍රව්‍ය ලැයිස්තුවක් ආපසු හරවා එයින් ලැයිස්තුවක් සාදන විට). මම මතක පරිභෝජනය පරීක්ෂා කළේ නැත. reverseඔබට පසුව ලැයිස්තු ගත කිරීමට අවශ්‍ය නැතිනම් වේගවත් විය හැකිය.
ඩකරොන්

5
මෙය ප්‍රතිලෝම ([1,2,3]) ට සමාන නොවන බව සඳහන් කිරීම වටී , අවසානයේ 'ඩී' ... එය පහත දැක්වෙන අනෙක් පිළිතුරු වලින් එකකි, මෙය ක්‍රියාත්මක වන අතර මෙය නැවත පැමිණෙන අතර iterator.
ලුසියානෝ

14
reversed()පෙති කැපීම වෙනුවට භාවිතා කරන්නේ ඇයි ? පයිතන්හි සෙන් කියවන්න, රීති අංක 7: කියවීමේ හැකියාව ගණන් ගනී!
kramer65

1260
>>> L = [0,10,20,40]
>>> L[::-1]
[40, 20, 10, 0]

විස්තාරණය කරන ලද පෙති සින්ටැක්ස් මුදා හැරීම සඳහා පයිතන් වට්ස් හි නව ප්‍රවේශය තුළ හොඳින් විස්තර කර ඇත2.3.5

විවරණයක ඇති විශේෂ ඉල්ලීම අනුව මෙය වඩාත් වර්තමාන පෙති ලේඛනයයි .


12
එය ලැයිස්තු පමණක් නොව ඕනෑම අන්තර්ක්‍රියාකාරී සඳහා ක්‍රියා කරයි. අවාසිය නම් එය ක්‍රියාත්මක නොවීමයි.
ස්විස්

6
It එය පෙත්තක් ආපසු ලබා දෙන බැවින් සත්‍ය ලැයිස්තු අන්තර්ගතය වෙනස් නොකරයි
fortran

12
un ලුනික්ස්බොක්ස් ආපසු හරවන ලද්දේ පයිතන් 3 හි ලැයිස්තුවක් නොව ඉරේටරයක් ​​ය.
ස්විස්

2
ස්වාභාවිකවම අරාව තුළ නිසි ලෙස කොටු නොවන්නේ නම්
අයිනර් පීටර්සන්

2
මම w ස්විස් සමඟ එකඟ වෙමි. +1 සිට මට අරාවෙහි මූලද්‍රව්‍ය තිබිය යුතු නමුත් අවසානයේ සිට ආරම්භය දක්වා. - වස්තුවක් reversedආපසු ලබා දෙයි listreverseiterator(පයිතන් 2.7.x), පසුව එය හරහා නැවත යෙදිය යුතුය - ප්‍රතිලෝම පෙති කැපීමෙන් ප්‍රතිලෝම ලැයිස්තුවක් / ටුපල් / ස්ට්‍රිං (ඔබ පෙති කපන දේ අනුව) ලබා දෙයි. In ඊනාර් පීටර්සන් නූලක් ආපසු හරවන බැවින් ප්‍රතිදානය නිවැරදි වේ. උත්සාහ කරන්න:co2=['ae','ad','ac','ab','aa','z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'] >>> co2[::-1]
ආරොන් නිව්ටන්

373
>>> L = [0,10,20,40]
>>> L.reverse()
>>> L
[40, 20, 10, 0]

හෝ

>>> L[::-1]
[40, 20, 10, 0]

62
[start: stop: step] එබැවින් පියවර -1
papalagi

39
විස්තරය: පළමුවැන්න තැනින් තැන ලැයිස්තුව වෙනස් කරයි, දෙවැන්න නව ප්‍රතිලෝම ලැයිස්තුවක් ලබා දෙයි, නමුත් එය මුල් ලැයිස්තුව වෙනස් නොකරයි.
franzlorenzon

7
දෙවන උදාහරණය විය යුත්තේ L=L[::-1]ලැයිස්තුව සැබවින්ම ආපසු හැරවීමයි, එසේ නොමැතිනම් ඔබ අගයන් ආපසු හරවා යැවීම පමණි
robertmoggach

මට කියමු මට l = [1,2,3,4,5,6] සහ n = 2 ඒවායේ ප්‍රති result ලය [6,5,1,2,3,4] විය යුතුය, අපට මෙය කළ හැක්කේ කෙසේද
අතුල් ජයින්

ඔබට මෙය කළ හැකිය:b = l[-n:] b.reverse() l = b + l[:len(l) - n]
ෂොයිබ් ෂකීල්

56

මෙය ලැයිස්තුව අනුපිටපත් කිරීම සඳහා ය:

L = [0,10,20,40]
p = L[::-1]  #  Here p will be having reversed list

මෙය තැනින් තැන ලැයිස්තුව ආපසු හැරවීමයි:

L.reverse() # Here L will be reversed in-place (no new list made)

52

පයිතන් හි ලැයිස්තුවක් ආපසු හැරවීමට හොඳම ක්‍රමය මෙය යැයි මම සිතමි.

a = [1,2,3,4]
a = a[::-1]
print(a)
>>> [4,3,2,1]

කාර්යය අවසන් කර ඇති අතර දැන් ඔබට ප්‍රතිලෝම ලැයිස්තුවක් ඇත.


28

පෙති කැපීම භාවිතා කිරීම, උදා: array = array [:: - 1], ඉතා පිළිවෙලට හා ඉතා පයිතොනික්, නමුත් සමහර විට නවකයින් සඳහා ටිකක් අපැහැදිලි විය හැකිය. ප්‍රතිලෝම () ක්‍රමය භාවිතා කිරීම එදිනෙදා කේතීකරණයට යාමට හොඳ ක්‍රමයක් වන්නේ එය පහසුවෙන් කියවිය හැකි බැවිනි.

කෙසේ වෙතත්, සම්මුඛ පරීක්ෂණ ප්‍රශ්නයක දී මෙන් ඔබට ලැයිස්තුවක් ආපසු හැරවීමට අවශ්‍ය නම්, ඔබට මෙවැනි ක්‍රම වලින් සාදන ලද ඒවා භාවිතා කිරීමට නොහැකි වනු ඇත. සම්මුඛ පරීක්‍ෂකවරයා ඔබ පයිතන් දැනුමේ ගැඹුරට වඩා ගැටලුවට ප්‍රවේශ වන්නේ කෙසේදැයි සොයා බලනු ඇත, ඇල්ගොරිතම ප්‍රවේශයක් අවශ්‍ය වේ. පහත උදාහරණය, ​​සම්භාව්‍ය හුවමාරුවක් භාවිතා කිරීම, එය කිරීමට එක් ක්‍රමයක් විය හැකිය: -

def reverse_in_place(lst):      # Declare a function
    size = len(lst)             # Get the length of the sequence
    hiindex = size - 1
    its = size/2                # Number of iterations required
    for i in xrange(0, its):    # i is the low index pointer
        temp = lst[hiindex]     # Perform a classic swap
        lst[hiindex] = lst[i]
        lst[i] = temp
        hiindex -= 1            # Decrement the high index pointer
    print "Done!"

# Now test it!!
array = [2, 5, 8, 9, 12, 19, 25, 27, 32, 60, 65, 1, 7, 24, 124, 654]

print array                    # Print the original sequence
reverse_in_place(array)        # Call the function passing the list
print array                    # Print reversed list


**The result:**
[2, 5, 8, 9, 12, 19, 25, 27, 32, 60, 65, 1, 7, 24, 124, 654]
Done!
[654, 124, 24, 7, 1, 65, 60, 32, 27, 25, 19, 12, 9, 8, 5, 2]

මෙය ටුපල්ස් හෝ නූල් අනුපිළිවෙලෙහි ක්‍රියා නොකරනු ඇති බව සලකන්න, මන්ද නූල් සහ ටුපල් වෙනස් කළ නොහැකි බැවින් මූලද්‍රව්‍ය වෙනස් කිරීමට ඔබට ඒවා ලිවිය නොහැක.


9
සම්භාව්‍ය හුවමාරුව හරහා කළ හැකිය lst[hiindex], lst[i] = lst[i], lst[hiindex], මම හිතන්නේ ... ;-)
සමෝත්

Am සමෝත් එම වාක්‍ය ඛණ්ඩය එතරම් පැහැදිලි නැති අතර හැසිරීම හරියටම පැහැදිලි නැත. පැහැදිලි පියවර වඩාත් අර්ථවත් කරයි.
ඇන්තනි

අරාව [:: - 1] වැනි දේ පයිතොනික් යැයි මිනිසුන් පවසන්නේ ඇයි? පයිතන් සෙන් අපට උගන්වන්නේ ව්‍යාජ සහ කියවීමේ හැකියාවන්ට වඩා පැහැදිලි බව වඩා හොඳ බවය. එවැනි දේවල් කිසිසේත්ම පැහැදිලි හා කියවිය නොහැක.
k4ppa

1
4 k4ppa: ඔබ පයිතන් දන්නේ නම්array[::-1] එය කියවිය හැකි සහ මනාව පැහැදිලි වේ . “කියවිය හැකි” යන්නෙන් අදහස් කරන්නේ “මීට පෙර කවදාවත් පයිතන් පෙති භාවිතා නොකළ කෙනෙකුට එය කියවිය හැකි විය යුතුය”; මෙම [::-1]ප්රතිවිරුද්ධ පෙත්තක් Python දී හාස්යජනක පොදු බස් වහරක් (ඔබ සියලු කාලය පවතින කේතය එය මුණගැසෙනු ඇත) වන අතර, එය සම්පූර්ණයෙන්ම හොඳින් කියවිය හැකි ය ඔබ නිතිපතා Python භාවිතා කරන්නේ නම් . ෂුවර්, first10 = [], for i in range(10): first10.append(array[i])පැහැදිලි හා නිශ්චිත වේ, නමුත් ඊට වඩා හොඳ වෙන්නේ නැහැ first10 = array[:10].
ෂැඩෝ රේන්ජර්

27

එකම ලැයිස්තුව ආපසු හැරවීම සඳහා:

array.reverse()

ආපසු හැරවූ ලැයිස්තුව වෙනත් ලැයිස්තුවකට පැවරීමට:

newArray = array[::-1] 

19

l.reverse()පයිතන් 3 සහ 2 හි දීර් list ලැයිස්තුවක් ආපසු හැරවිය හැකි වේගවත්ම ක්‍රමය එය බව මම සොයා ගතිමි (වෙනත් යෝජනා වලට පටහැනිව) .

l[::-1]එය ආපසු හැරවීමට පෙර ලැයිස්තුව පිටපත් කරන නිසා එය මන්දගාමී වේ. පෙන්වු list()විසින් ඉදිරිපත් කරන ලද iterator පමණ ඇමතුමක් reversed(l)සමහර පොදු කාර්ය එකතු විය යුතුයි. ඇත්ත වශයෙන්ම ඔබට ලැයිස්තුවේ පිටපතක් හෝ අනුකාරකයක් අවශ්‍ය නම් එම ක්‍රම භාවිතා කරන්න, නමුත් ඔබට ලැයිස්තුව ආපසු හැරවීමට අවශ්‍ය නම් l.reverse()වේගවත්ම ක්‍රමය ලෙස පෙනේ.

කාර්යයන්

def rev_list1(l):
    return l[::-1]

def rev_list2(l):
    return list(reversed(l))

def rev_list3(l):
    l.reverse()
    return l

ලැයිස්තුව

l = list(range(1000000))

පයිතන් 3.5 වේලාවන්

timeit(lambda: rev_list1(l), number=1000)
# 6.48
timeit(lambda: rev_list2(l), number=1000)
# 7.13
timeit(lambda: rev_list3(l), number=1000)
# 0.44

පයිතන් 2.7 වේලාව

timeit(lambda: rev_list1(l), number=1000)
# 6.76
timeit(lambda: rev_list2(l), number=1000)
# 9.18
timeit(lambda: rev_list3(l), number=1000)
# 0.46

4
list.reverseඑය වේගවත්ම වේ, මන්ද එය තැනින් තැන ආපසු හැරේ
warvariuc

ඔබ නිවැරදියි list.reverse()වේගවත්ය, නමුත් ඔබ ද izing ුවම් කරයි reversed(ඔබට නව දෙයක් අවශ්‍ය නොවන විට එය වඩාත් සුදුසුය , මුල් පිටපත විකෘති නොකර listදැනට පවතින listප්‍රතිලෝම අනුපිළිවෙලට නැවත සැකසීමට), සහ පෙත්ත (මුල් පිටපත විකෘති කිරීමෙන් ද වළක්වයි list, සහ සාමාන්‍යයෙන් reversedආදානය කුඩා වන විට වඩා වේගවත් වේ). ඔව්, ඔබට පිටපතක් අවශ්‍ය නොවන්නේ නම්, පිටපත් කරන ඕනෑම දෙයක් වඩා මිල අධිකය, නමුත් බොහෝ වේලාවක්, මුල් වටිනාකම විකෘති කිරීමට ඔබට අවශ්‍ය නැත.
ෂැඩෝ රේන්ජර්

එය reversed තවමත් එසේ නැති වී යනlist.reverse() බවක් පෙනේ , නමුත් එය ආදානය විකෘති නොකරන්නේ නම් list, එය බොහෝ අවස්ථාවන්හිදී වඩා හොඳය. අලාභය reversedකුඩා වේ (than 1/6 ට වඩා දිගු list.reverse()).
ෂැඩෝ රේන්ජර්

16
for x in array[::-1]:
    do stuff

මෙම පෙති කපන ක්‍රමය එතරම් කියවිය නොහැක. පයිතොනික් ක්‍රමය වනුයේ ප්‍රතිලෝම () ක්‍රමය භාවිතා කිරීමයි. ;-)
සයිමන් එම්

Im සිමොන් එම් ප්‍රතිලෝම () බැලූ බැල්මට තේරුම් ගැනීම පහසුය.
ස්විස්



8

පැහැදිලි කිරීම සහ කාල ප්‍රති .ල සහිත ක්‍රමවල සාරාංශය

හොඳ පිළිතුරු කිහිපයක් ඇත, නමුත් පැතිරී ඇති අතර බොහෝ ඒවා එක් එක් ප්‍රවේශයේ මූලික වෙනස්කම් දක්වන්නේ නැත.

සමස්තයක් ලෙස, ඕනෑම ශ්‍රිතයක් මෙන්, ආපසු හැරවීම සඳහා සාදන ලද ශ්‍රිත / ක්‍රම භාවිතා කිරීම වඩා හොඳය. මෙම අවස්ථාවෙහිදී, ඒවා කෙටි ලැයිස්තු (අයිතම 10) මත දළ වශයෙන් 2 සිට 8 ගුණයක් වේගවත් වන අතර, අතින් සාදන ලද සුචිගත කිරීමේ මාධ්‍යයක් සමඟ සසඳන විට දිගු ලැයිස්තු වල ~ 300 + ගුණයක් වේගවත් වේ. විශේෂ experts යන් ඒවා නිර්මාණය කිරීම, සෝදිසි කිරීම සහ ප්‍රශස්තකරණය කිරීම නිසා මෙය අර්ථවත් කරයි. ඔවුන් අඩුපාඩු වලට ගොදුරු වීමේ අවදානම අඩු වන අතර දාර සහ කෙළවරේ සිදුවීම් හැසිරවීමට වැඩි ඉඩක් ඇත.

ඔබට අවශ්‍ය දැයි සලකා බලන්න:

  1. පවතින ලැයිස්තුවක් ආපසු හරවන්න
    • හොඳම විසඳුම object.reverse()ක්‍රමයයි
  2. ලැයිස්තුවේ පිටුපස පැත්තෙහි අනුකාරකයක් සාදන්න (ඔබ එය ලූපයක්, උත්පාදක යන්ත්‍රයක් ආදිය සඳහා පෝෂණය කිරීමට යන නිසා)
    • හොඳම විසඳුම වන්නේ reversed(object)අනුකාරකය නිර්මාණය කිරීමයි
  3. හෝ ප්‍රතිලෝම අනුපිළිවෙලට ඇති සම්පූර්ණ පිටපතක් සාදන්න
    • හොඳම විසඳුම වන්නේ පියවර -1 ක ප්‍රමාණයක් සහිත පෙති භාවිතා කිරීමයි: object[::-1]

පරීක්ෂණ පිටපත

ආවරණය කරන ලද ක්‍රම සඳහා මගේ පරීක්ෂණ පිටපතෙහි ආරම්භය මෙන්න. මෙම පිළිතුරේ ඇති සියලුම කේත ස්නිපෙට් එකට දමා ලැයිස්තුවක් ආපසු හැරවීමේ විවිධ ක්‍රම ක්‍රියාත්මක කරන ස්ක්‍රිප්ට් එකක් සහ වේලාව එක් එක් කාලය (අවසාන කොටසේ ප්‍රතිදානය).

from timeit import timeit
from copy import copy

def time_str_ms(t):
    return '{0:8.2f} ms'.format(t * 1000)

ක්රමය 1: obj.reverse () සමඟ ප්රතිවිකුණුම් කරන්න

ඉලක්කය හුදෙක් පවත්නා ලැයිස්තුවක ඇති අයිතමවල අනුපිළිවෙල ආපසු හැරවීම නම්, ඒවා ලිහිල් නොකර හෝ වැඩ කිරීමට පිටපතක් ලබා නොගෙන, භාවිතා කරන්න <list>.reverse() ශ්‍රිතය . ලැයිස්තු වස්තුවක් මත මෙය කෙලින්ම ධාවනය කරන්න, එවිට සියලු අයිතමවල අනුපිළිවෙල ආපසු හරවනු ලැබේ:

පහත දැක්වෙන්නේ ආපසු හරවන ලද ලැයිස්තුව ආපසු ලබා දුන්නද, ලබා දී ඇති මුල් විචල්‍යය ආපසු හරවන බවයි. එනම් ඔබට මෙම ශ්‍රිත ප්‍රතිදානය භාවිතා කර පිටපතක් සෑදිය හැකිය. සාමාන්‍යයෙන්, ඔබ මේ සඳහා ශ්‍රිතයක් නොකරනු ඇත, නමුත් අවසානයේ දී කාල කේතය භාවිතා කිරීමට මම එසේ කළෙමි.

අපි මෙම ක්‍රම දෙකෙහි ක්‍රියාකාරිත්වය පරීක්ෂා කර බලමු - පළමුව තැනින් තැන ලැයිස්තුවක් ආපසු හරවන්න (මුල් ලැයිස්තුව වෙනස් කරන්න), ඉන්පසු ලැයිස්තුව පිටපත් කර පසුව ආපසු හරවන්න.

def rev_in_place(mylist):
    mylist.reverse()
    return mylist

def rev_copy_reverse(mylist):
    a = copy(mylist)
    a.reverse()
    return a

ක්රමය 2: පෙති භාවිතයෙන් ලැයිස්තුවක් ආපසු හරවන්න obj[::-1]

සාදන ලද දර්ශක පෙති කපන ක්‍රමය මඟින් ඕනෑම සුචිගත කරන ලද වස්තුවක කොටසක පිටපතක් සෑදීමට ඔබට ඉඩ සලසයි.

  • එය මුල් වස්තුවට බලපාන්නේ නැත
  • එය සම්පූර්ණ ලැයිස්තුවක් සාදයි, අනුකාරකයක් නොවේ

සාමාන්‍ය වාක්‍ය ඛණ්ඩය : <object>[first_index:last_index:step]. සරල ප්‍රතිලෝම ලැයිස්තුවක් නිර්මාණය කිරීම සඳහා පෙති කැපීම සූරාකෑමට, භාවිතා කරන්න : <list>[::-1]. විකල්පයක් හිස්ව තබන විට, එය ඒවා වස්තුවේ පළමු හා අවසාන මූලද්‍රව්‍යයේ පෙරනිමි ලෙස සකසයි (පියවරේ ප්‍රමාණය .ණ නම් ආපසු හරවනු ලැබේ).

සුචිගත කිරීම මඟින් කෙනෙකුට negative ණ සංඛ්‍යා භාවිතා කිරීමට ඉඩ ලබා දේ, එය වස්තුවේ දර්ශකයේ අවසානයේ සිට පසුපසට ගණන් කරයි (එනම් -2 යනු අවසාන අයිතමයේ දෙවැන්නයි). පියවර ප්‍රමාණය negative ණ වන විට, එය අවසාන අයිතමය සමඟ ආරම්භ වන අතර එම ප්‍රමාණයෙන් දර්ශකය පසුපසට යනු ඇත. මේ සමඟ සම්බන්ධිත ආරම්භක තර්කනයක් ප්‍රශස්තිකරණය කර ඇත.

def rev_slice(mylist):
    a = mylist[::-1]
    return a

ක්රමය 3: reversed(obj)iterator ශ්‍රිතය සමඟ ලැයිස්තුවක් ආපසු හරවන්න

ඒ නිසා එය reversed(indexed_object)ක්රියාව:

  • මෙය ප්‍රතිලෝම දර්ශක අනුකාරකයක් නිර්මාණය කරයි, ලැයිස්තුවක් නොවේ. විශාල ලැයිස්තු වල වඩා හොඳ ක්‍රියාකාරිත්වය සඳහා ඔබ එය ලූපයකට පෝෂණය කරන්නේ නම් නියමයි
  • මෙය පිටපතක් නිර්මාණය කරන අතර මුල් වස්තුවට බලපාන්නේ නැත

අමු අනුකාරකයක් සමඟ පරීක්ෂා කරන්න, සහ අනුකාරකයෙන් ලැයිස්තුවක් සාදන්න.

def reversed_iterator(mylist):
    a = reversed(mylist)
    return a

def reversed_with_list(mylist):
    a = list(reversed(mylist))
    return a

ක්රමය 4: අභිරුචි / අත්පොත සුචිගත කිරීම සමඟ ප්රතිලෝම ලැයිස්තුව

වේලාව පෙන්වන පරිදි, ඔබේම සුචිගත කිරීමේ ක්‍රම නිර්මාණය කිරීම නරක අදහසකි. ඔබට සැබවින්ම අභිරුචි යමක් කිරීමට අවශ්‍ය නම් මිස, සාදන ලද ක්‍රම භාවිතා කරන්න.

එයින් කියැවෙන්නේ කුඩා ලැයිස්තු ප්‍රමාණ සහිත විශාල ද penalty ුවමක් නොමැති නමුත් ඔබ පරිමාණය වැඩි කළ විට ද penalty ුවම අති විශාල වන බවයි. පහත දැක්වෙන මගේ කේතය ප්‍රශස්තිකරණය කළ හැකි බව මට විශ්වාසයි, නමුත් මම සාදන ලද ක්‍රම සමඟ බැඳී සිටිමි.

def rev_manual_pos_gen(mylist):
    max_index = len(mylist) - 1
    return [ mylist[max_index - index] for index in range(len(mylist)) ]

def rev_manual_neg_gen(mylist):
    ## index is 0 to 9, but we need -1 to -10
    return [ mylist[-index-1] for index in range(len(mylist)) ]

def rev_manual_index_loop(mylist):
    a = []
    reverse_index = len(mylist) - 1
    for index in range(len(mylist)):
        a.append(mylist[reverse_index - index])
    return a

def rev_manual_loop(mylist):
    a = []
    reverse_index = len(mylist)
    for index, _ in enumerate(mylist):
        reverse_index -= 1
        a.append(mylist[reverse_index])
    return a

එක් එක් ක්රමය වේලාව

ආපසු හැරවීමේ සෑම ක්‍රමයක්ම වරින් වර ඉතිරි පිටපත පහත දැක්වේ. එය ප්‍රතිවර්තනය obj.reverse()හා තැනීම පෙන්වයිreversed(obj) ප්‍රතිනිර්මාණය සෑදීම සැමවිටම වේගවත් වන අතර පෙති භාවිතා කිරීම පිටපතක් නිර්මාණය කිරීමේ වේගවත්ම ක්‍රමයයි.

ඔබට එය කළ යුතු නම් මිස එය තනිවම කිරීමට ක්‍රමයක් නිර්මාණය නොකිරීමටද එය ඔප්පු කරයි!

loops_to_test = 100000
number_of_items = 10
list_to_reverse = list(range(number_of_items))
if number_of_items < 15:
    print("a: {}".format(list_to_reverse))
print('Loops: {:,}'.format(loops_to_test))
# List of the functions we want to test with the timer, in print order
fcns = [rev_in_place, reversed_iterator, rev_slice, rev_copy_reverse,
        reversed_with_list, rev_manual_pos_gen, rev_manual_neg_gen,
        rev_manual_index_loop, rev_manual_loop]
max_name_string = max([ len(fcn.__name__) for fcn in fcns ])
for fcn in fcns:
    a = copy(list_to_reverse) # copy to start fresh each loop
    out_str = ' | out = {}'.format(fcn(a)) if number_of_items < 15 else ''
    # Time in ms for the given # of loops on this fcn
    time_str = time_str_ms(timeit(lambda: fcn(a), number=loops_to_test))
    # Get the output string for this function
    fcn_str = '{}(a):'.format(fcn.__name__)
    # Add the correct string length to accommodate the maximum fcn name
    format_str = '{{fx:{}s}} {{time}}{{rev}}'.format(max_name_string + 4)
    print(format_str.format(fx=fcn_str, time=time_str, rev=out_str))

කාල ප්‍රති .ල

ප්‍රති task ල වලින් පෙනී යන්නේ යම් කාර්යයක් සඳහා වඩාත් සුදුසු බිල්ට් ක්‍රම සමඟ පරිමාණය වඩාත් හොඳින් ක්‍රියාත්මක වන බවයි. වෙනත් වචන වලින් කිවහොත්, වස්තු මූලද්‍රව්‍ය ගණන වැඩි වන විට, සාදන ලද ක්‍රමවලට වඩා ඉහළ කාර්ය සාධන ප්‍රති .ල ලැබීමට පටන් ගනී.

දේවල් එකට ගැටීමට වඩා ඔබට අවශ්‍ය දේ කෙලින්ම සාක්ෂාත් කරගත හැකි හොඳම බිල්ට් ක්‍රමය භාවිතා කිරීම වඩා හොඳය. ඔබට ආපසු හරවන ලද ලැයිස්තුවේ පිටපතක් අවශ්‍ය නම් පෙති කැපීම වඩාත් සුදුසුය - එය ශ්‍රිතයෙන් ලැයිස්තුවක් reversed()සෑදීමට වඩා වේගවත් වන අතර ලැයිස්තුවේ පිටපතක් සාදා තැන තැනට වඩා වේගවත් වේobj.reverse() . නමුත් එම ක්‍රමවලින් එකක් ඔබට සැබවින්ම අවශ්‍ය නම් ඒවා වේගවත් නමුත් කිසි විටෙකත් වේගයට වඩා දෙගුණයකින් වැඩි නොවේ. මේ අතර - අභිරුචි, අතින් ක්‍රමවේදයන්ට විශාල ප්‍රමාණයේ ඇණවුම් ගත හැකිය, විශේෂයෙන් ඉතා විශාල ලැයිස්තු සමඟ.

පරිමාණය සඳහා, අයිතම 1000 ක ලැයිස්තුවක් සමඟ, reversed(<list>)ක්‍රියාකාරී ඇමතුම නැවත සැකසීමට ms 30 ms ගත වේ, ස්ථානය ආපසු හැරවීමට ms 55 ms ගත වේ, පෙති ක්‍රමය භාවිතා කර සම්පූර්ණ ප්‍රතිලෝම ලැයිස්තුවේ පිටපතක් සෑදීමට ~ 210 ms ගත වේ, නමුත් මම සෑදූ වේගවත්ම අත්පොත ක්‍රමය ඩොලර් 8400 ක් විය !!

ලැයිස්තුවේ අයිතම 2 ක් සමඟ:

a: [0, 1]
Loops: 100,000
rev_in_place(a):             24.70 ms | out = [1, 0]
reversed_iterator(a):        30.48 ms | out = <list_reverseiterator object at 0x0000020242580408>
rev_slice(a):                31.65 ms | out = [1, 0]
rev_copy_reverse(a):         63.42 ms | out = [1, 0]
reversed_with_list(a):       48.65 ms | out = [1, 0]
rev_manual_pos_gen(a):       98.94 ms | out = [1, 0]
rev_manual_neg_gen(a):       88.11 ms | out = [1, 0]
rev_manual_index_loop(a):    87.23 ms | out = [1, 0]
rev_manual_loop(a):          79.24 ms | out = [1, 0]

ලැයිස්තුවේ අයිතම 10 ක් සමඟ:

rev_in_place(a):             23.39 ms | out = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
reversed_iterator(a):        30.23 ms | out = <list_reverseiterator object at 0x00000290A3CB0388>
rev_slice(a):                36.01 ms | out = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
rev_copy_reverse(a):         64.67 ms | out = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
reversed_with_list(a):       50.77 ms | out = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
rev_manual_pos_gen(a):      162.83 ms | out = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
rev_manual_neg_gen(a):      167.43 ms | out = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
rev_manual_index_loop(a):   152.04 ms | out = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
rev_manual_loop(a):         183.01 ms | out = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

ලැයිස්තුවේ අයිතම 1000 ක් සමඟ:

rev_in_place(a):             56.37 ms
reversed_iterator(a):        30.47 ms
rev_slice(a):               211.42 ms
rev_copy_reverse(a):        295.74 ms
reversed_with_list(a):      418.45 ms
rev_manual_pos_gen(a):     8410.01 ms
rev_manual_neg_gen(a):    11054.84 ms
rev_manual_index_loop(a): 10543.11 ms
rev_manual_loop(a):       15472.66 ms

7

ආපසු හැරවූ (අරාව) භාවිතා කිරීම හොඳම මාර්ගය වනු ඇත.

>>> array = [1,2,3,4]
>>> for item in reversed(array):
>>>     print item

ඔබ ඉදි භාවිතයෙන් තොරව මෙය ක්රියාත්මක කිරීම හැක්කේ කෙසේද? යන්න වටහා ගැනීම අවශ්ය reversed.

def reverse(a):
    midpoint = len(a)/2
    for item in a[:midpoint]:
        otherside = (len(a) - a.index(item)) - 1
        temp = a[otherside]
        a[otherside] = a[a.index(item)]
        a[a.index(item)] = temp
    return a

මේ සඳහා O (N) කාලය ගත යුතුය.


ප්‍රතිලෝම ශ්‍රිතය භාවිතා නොකර එය කරන්නේ කෙසේදැයි සොයමින් සිටියේය. ස්තූතියි.
බර්නාඩ් 'බීටා බර්ලින්' පරා

නැතහොත් ස්ථානයේ ආපසු හැරවීමට භාවිතා කරන්න list = list.reverse ()
සයිමන් එම්

5

ඔබ සමහර වෙනත් විචල්ය දී ආපස්සට ලැයිස්තුව මූලද්රව්ය ගබඩා කිරීමට අවශ්ය නම්, ඔබ භාවිතා කළ හැකිය revArray = array[::-1]හෝ revArray = list(reversed(array)).

නමුත් පළමු ප්‍රභේදය තරමක් වේගවත් ය:

z = range(1000000)
startTimeTic = time.time()
y = z[::-1]
print("Time: %s s" % (time.time() - startTimeTic))

f = range(1000000)
startTimeTic = time.time()
g = list(reversed(f))
print("Time: %s s" % (time.time() - startTimeTic))

ප්‍රතිදානය:

Time: 0.00489711761475 s
Time: 0.00609302520752 s

2
ඊළඟ වතාවේ, ඔබට භාවිතා කිරීමට අවශ්‍ය විය හැකිය timeit.
grooveplex

5

සංවිධානාත්මක වටිනාකම්:

පයිතන් හි, ලැයිස්තු අනුපිළිවෙල ද හැසිරවිය හැකිය වර්ග කිරීම ඔබේ විචල්‍යයන් සංඛ්‍යාත්මක / අකාරාදී පිළිවෙලට සංවිධානය කරයි:

තාවකාලිකව:

print(sorted(my_list))

ස්ථිර:

my_list.sort(), print(my_list)

ඔබට "ප්‍රතිලෝම = සත්‍ය" ධජය සමඟ වර්ග කළ හැකිය :

print(sorted(my_list, reverse=True))

හෝ

my_list.sort(reverse=True), print(my_list)

සංවිධානය කිරීමකින් තොරව

සමහර විට ඔබට අගයන් වර්ග කිරීමට අවශ්‍ය නොවනු ඇත, නමුත් අගයන් ආපසු හැරවීම පමණි. එවිට අපට එය මේ ආකාරයෙන් කළ හැකිය:

print(list(reversed(my_list)))

** ලැයිස්තු අනුපිළිවෙලට අක්ෂරවලට වඩා අංකවලට ප්‍රමුඛතාවයක් ඇත. පයිතන් සාරධර්ම සංවිධානය නියමයි.


4

යම් තර්කනයක් භාවිතා කිරීම

සම්මුඛ පරීක්ෂණ සඳහා පුහුණුවීම සඳහා පැරණි පාසල් තර්කනයක් භාවිතා කිරීම.

ඉදිරිපස සිට පසුපසට අංක මාරු කිරීම. දර්ශක දෙකක් භාවිතා කිරීමindex[0] and index[last]

def reverse(array):
    n = array
    first = 0
    last = len(array) - 1
    while first < last:
      holder = n[first]
      n[first] = n[last]
      n[last] = holder
      first += 1
      last -= 1
    return n

input -> [-1 ,1, 2, 3, 4, 5, 6]
output -> [6, 1, 2, 3, 4, 5, -1]

අපි ලැයිස්තුව දෙකට බෙදී පළමු දර්ශකය අන්තිම දර්ශකය සමඟ මාරු කළහොත් කාල සංකීර්ණත්වය ලැයිස්තුගත කළ නියැදියට වඩා කාර්යක්ෂම වනු ඇත.
ඊශ්‍රායලය මැන්සෝ

3

ප්‍රතිලෝමව අරාව හරහා ගමන් කිරීමට ඔබට අරාව දර්ශකයේ බිට්වයිස් අනුපූරකය භාවිතා කළ හැකිය :

>>> array = [0, 10, 20, 40]
>>> [array[~i] for i, _ in enumerate(array)]
[40, 20, 10, 0]

ඔබ කුමක් කළත්, මේ ආකාරයෙන් එය නොකරන්න.


3

ලැයිස්තු අවබෝධය භාවිතා කරන්න:

[array[n] for n in range(len(array)-1, -1, -1)]

3

තවත් විසඳුමක් භාවිතා කිරීමට වනු ඇත numpy.flip මේ සඳහා

import numpy as np
array = [0, 10, 20, 40]
list(np.flip(array))
[40, 20, 10, 0]

2

නිශ්චිතවම කිවහොත්, ප්‍රශ්නය වන්නේ ලැයිස්තුවක් ආපසු හරවා යැවීම නොව උදාහරණ ලැයිස්තු නාමයක් සහිත ලැයිස්තුවක් ආපසු හරවා ගන්නේ කෙසේද යන්නයි array .

"array"භාවිතය නම් ලැයිස්තුවක් ආපසු හැරවීමට array.reverse().

විස්තර කර ඇති පරිදි ඇදහිය නොහැකි තරම් ප්‍රයෝජනවත් පෙති ක්‍රමය මඟින් ලැයිස්තුවක් ආපසු හැරවීමට භාවිතා කළ හැකිය array = array[::-1].


3
අවසාන වාක්‍යය සත්‍ය නොවේ, මෙය ලැයිස්තුවක් ආපසු හරවන්නේ නැත; එය පැවසිය යුතුයarray[:] = array[::-1]
ඇන්ටි හාපාල


2

සම්මුඛ පරීක්ෂණ සැකසුම් යැයි උපකල්පනය කරමින් අවම වශයෙන් ගොඩනංවන ලද කාර්යයන් සමඟ

array = [1, 2, 3, 4, 5, 6,7, 8]
inverse = [] #create container for inverse array
length = len(array)  #to iterate later, returns 8 
counter = length - 1  #because the 8th element is on position 7 (as python starts from 0)

for i in range(length): 
   inverse.append(array[counter])
   counter -= 1
print(inverse)


2

ආපසු හැරවූ ලැයිස්තුව ලබා ගැනීමට ක්‍රම 3 ක් ඇත:

  1. පෙති කැපීමේ ක්‍රමය 1: reversed_array = array[-1::-1]

  2. පෙති කැපීමේ ක්‍රමය 2: reversed_array2 = array[::-1]

  3. බිල්ඩින් ශ්‍රිතය භාවිතා කිරීම: reversed_array = array.reverse()

තෙවන ශ්‍රිතය ඇත්ත වශයෙන්ම ලැයිස්තුගත වස්තුව ප්‍රතිස්ථාපනය කළේය. ඒ කියන්නේ නියම දත්තවල පිටපතක් පවත්වාගෙන යන්නේ නැහැ. පැරණි අනුවාදය පවත්වා ගැනීමට ඔබට අවශ්‍ය නැතිනම් මෙය හොඳ ප්‍රවේශයකි. නමුත් ඔබට පැරණි හා ප්‍රතිලෝම අනුවාදය අවශ්‍ය නම් විසඳුමක් ලෙස නොපෙනේ.


1

ඔබේ අවශ්‍යතාව පයිතන් වෙත වඩාත් සෘජුවම පරිවර්තනය කිරීම මෙම forප්‍රකාශයයි:

for i in xrange(len(array) - 1, -1, -1):
   print i, array[i]

මෙය තරමක් ගුප්ත නමුත් ප්‍රයෝජනවත් විය හැකිය.



1

ඔබට සෑම විටම ලැයිස්තුවේ පිටුපස කෙළවරේ සිට මූලද්‍රව්‍ය ඉහළට ඔසවා තැබීම වැනි ලැයිස්තුවක් ලෙස සැලකිය හැකිය. එමඟින් ඔබ තොගයක අවසාන ලක්ෂණ වලින් පළමුව ප්‍රයෝජන ගන්න. ඇත්ත වශයෙන්ම ඔබ 1 වන අරාව පරිභෝජනය කරයි. මම මෙම ක්‍රමයට කැමතියි එය ඉතා බුද්ධිමත් බැවින් එක් ලැයිස්තුවක් පිටුපස කෙළවරේ සිට පරිභෝජනය කරන අතර අනෙක් අන්තය ඉදිරිපස කෙළවරේ සිට ඉදිකරනු ලැබේ.

>>> l = [1,2,3,4,5,6]; nl=[]
>>> while l:
        nl.append(l.pop())  
>>> print nl
[6, 5, 4, 3, 2, 1]


0
>>> l = [1, 2, 3, 4, 5]
>>> print(reduce(lambda acc, x: [x] + acc, l, []))
[5, 4, 3, 2, 1]

මෙම විසඳුම 4.5k ගුණයකින් මන්දගාමී l[::-1]වන අතර ඒ සමඟම පැහැදිලිව පෙනේ. පයිතන් හි ක්‍රියාකාරී වැඩසටහන් කිරීම මන්දගාමී වේ.
ඩකරොන්

0

ප්‍රතිවිරුද්ධ දර්ශකවල යොමු මාරු කිරීමෙන් තැනින් තැන ආපසු හැරවීම:

>>> l = [1,2,3,4,5,6,7]    
>>> for i in range(len(l)//2):
...     l[i], l[-1-i] = l[-1-i], l[i]
...
>>> l
[7, 6, 5, 4, 3, 2, 1]

1
අමුතු දිග ලැයිස්තු සඳහා ක්‍රියා කරයි!

මගේ විසඳුම හරි! පයිතන් සුචිගත කිරීම ක්‍රියාත්මක කරන්නේ කෙසේදැයි ඔබ දන්නවා. දකුණේ සිට වමට ඔබට 0,1,2 ... සහ වමේ සිට දකුණට -1, -2, -3 .. ආදිය ඇත. ලැයිස්තුවක් ආපසු හැරවීමට, ඔබ එය කොටස් දෙකකට කපා දර්ශක ගුණ කරන්න දකුණට වම්පස ඇති ප්‍රතිවිරුද්ධයන් විසින් us ණ එකක්.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.