Reverse () işlevi gibi çalışan Python kodunu yazma

Reverse() fonksiyonunu parçalamak ve pratik için kodda yazmak istiyorum. Sonunda nasıl yapılacağını öğrendim (orijinal listeden geriye doğru adım atın ve yeni 'ters çevrilmiş' listesine ekleyin) ancak bunun neden işe yaramadığını merak ediyorum.

def reverse(list):
    newlist = []
    index = 0
    while index < len(list):
        newlist[index] = list[(len(list)) - 1 - index]
        index = index + 1
    return newlist

list = [1, 2, 3, 4, 5]
print(reverse(list))
0
list Python'da ayrılmış bir anahtar kelimedir - Dont değişken olarak kullanmayın!
katma yazar alfasin, kaynak
list Python'da ayrılmış bir anahtar kelimedir - Dont değişken olarak kullanmayın!
katma yazar alfasin, kaynak
bunun neden işe yaramadığını merak etme - Lütfen sorunu net bir şekilde açıklayın.
katma yazar thefourtheye, kaynak
Yerleşik reverse olduğunu unutmayın bir işlev değildir, bir list yöntemidir ve yenisini oluşturmak yerine listeyi yerinde değiştirir. İşlevini düşünüyorsanız, ters , bu daha ilginç - ama ya yeni bir liste yapmıyor; sadece mevcut listenin üzerinde bir ters-yineleyici döndürür.
katma yazar abarnert, kaynak
Yerleşik reverse olduğunu unutmayın bir işlev değildir, bir list yöntemidir ve yenisini oluşturmak yerine listeyi yerinde değiştirir. İşlevini düşünüyorsanız, ters , bu daha ilginç - ama ya yeni bir liste yapmıyor; sadece mevcut listenin üzerinde bir ters-yineleyici döndürür.
katma yazar abarnert, kaynak

12 cevap

Python'da, indeks 0 aralığında ve listenin uzunluğu - 1 değilse, listenin bir öğesine erişemez/güncelleyemezsiniz.

Senin durumunda, 0'a eleman atamaya çalışıyorsun, ama liste boş. Yani, dizin 0'a sahip değil. Bu yüzden hata ile başarısız oluyor.

IndexError: atama dizini aralık dışında

Bunun yerine, append işlevini kullanabilirsiniz, bunun gibi

    newlist.append(list[(len(list)) - 1 - index])

Bunun dışında range işlevi bu şekilde geriye saymak için

for index in range(len(list) - 1, -1, -1):
    newlist.append(list[index])

index 'inizi kendiniz arttırmanız bile gerekmez, for döngüsü bununla ilgilenir.


@ Abarnert tarafından önerildiği gibi, aslında listeyi yineleyebilir ve öğeleri başlangıçta her seferinde ekleyebilirsiniz.

>>> def reverse(mylist):
...     result = []
...     for item in mylist:
...         result.insert(0, item)
...     return result
... 
>>> reverse([1, 2, 3, 4, 5])
[5, 4, 3, 2, 1]

Yeni bir ters liste oluşturmak istiyorsanız, kendi başınıza bir işlev yazmak zorunda kalmayabilirsiniz, bunun yerine dilimleme notasyonunu kullanabilirsiniz bunun gibi yeni bir ters liste oluşturmak için

>>> mylist = [1, 2, 3, 4, 5]
>>> mylist[::-1]
[5, 4, 3, 2, 1]

ancak bu orijinal nesneyi değiştirmiyor.

>>> mylist = [1, 2, 3, 4, 5]
>>> mylist[::-1]
[5, 4, 3, 2, 1]
>>> mylist
[1, 2, 3, 4, 5]

orijinal nesneyi değiştirmek istiyorsanız, dilimi tekrar orijinal nesnenin dilimine atayın, bunun gibi

>>> mylist
[1, 2, 3, 4, 5]
>>> mylist[:] = mylist[::-1]
>>> mylist
[5, 4, 3, 2, 1]

Note: reversed actually returns a reverse iterator object, not a list. So, it doesn't build the entire list reversed. Instead it returns elements one by one when iterated with next protocol.

>>> reversed([1, 2, 3, 4, 5])

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

Dolayısıyla, bunun gibi bir jeneratör işlevi yapmak isteyebilirsiniz.

>>> def reverse(mylist):
...     for index in range(len(mylist) - 1, -1, -1):
...         yield mylist[index]
...     
... 
>>> reverse([1, 2, 3, 4, 5])

Böylece reverse işlevi bir jeneratör nesnesi döndürür. Eğer bir liste istiyorsanız, bunun gibi list işleviyle bir tane oluşturabilirsiniz.

>>> list(reverse([1, 2, 3, 4, 5]))
[5, 4, 3, 2, 1]

eğer sadece birer birer işlem yapacaksanız, bunun için for döngüsü ile yineleyin, bunun gibi

>>> for i in reverse([1, 2, 3, 4, 5]):
...     print(i)
...     
... 
5
4
3
2
1
4
katma
@ thefourtheye teşekkürler !!!! bu harika !!!
katma yazar SpicyClubSauce, kaynak
@ abarnert Ah, teşekkürler :-) Güzel bir öneri. Eklemek için düzenleme yaptım. Lütfen kontrol edin :-)
katma yazar thefourtheye, kaynak
Sadece mekanik olarak düzeltmek yerine kodunu yeniden gözden geçirme konusunda bazı harika fikirler. Yapmak isteyebileceğiniz diğer bir öneri, mylist'teki değer için : newlist.insert (0, value) , işleri tersine çevirerek sık sık nasıl basitleştirebileceğinizi göstermek için ( hesaplamanıza gerek yok) len (lst) - index - 1 , ters sırada yineleme yapmak yerine ters sırada eklerseniz).
katma yazar abarnert, kaynak

Python'da, indeks 0 aralığında ve listenin uzunluğu - 1 değilse, listenin bir öğesine erişemez/güncelleyemezsiniz.

Senin durumunda, 0'a eleman atamaya çalışıyorsun, ama liste boş. Yani, dizin 0'a sahip değil. Bu yüzden hata ile başarısız oluyor.

IndexError: atama dizini aralık dışında

Bunun yerine, append işlevini kullanabilirsiniz, bunun gibi

    newlist.append(list[(len(list)) - 1 - index])

Bunun dışında range işlevi bu şekilde geriye saymak için

for index in range(len(list) - 1, -1, -1):
    newlist.append(list[index])

index 'inizi kendiniz arttırmanız bile gerekmez, for döngüsü bununla ilgilenir.


@ Abarnert tarafından önerildiği gibi, aslında listeyi yineleyebilir ve öğeleri başlangıçta her seferinde ekleyebilirsiniz.

>>> def reverse(mylist):
...     result = []
...     for item in mylist:
...         result.insert(0, item)
...     return result
... 
>>> reverse([1, 2, 3, 4, 5])
[5, 4, 3, 2, 1]

Yeni bir ters liste oluşturmak istiyorsanız, kendi başınıza bir işlev yazmak zorunda kalmayabilirsiniz, bunun yerine dilimleme notasyonunu kullanabilirsiniz bunun gibi yeni bir ters liste oluşturmak için

>>> mylist = [1, 2, 3, 4, 5]
>>> mylist[::-1]
[5, 4, 3, 2, 1]

ancak bu orijinal nesneyi değiştirmiyor.

>>> mylist = [1, 2, 3, 4, 5]
>>> mylist[::-1]
[5, 4, 3, 2, 1]
>>> mylist
[1, 2, 3, 4, 5]

orijinal nesneyi değiştirmek istiyorsanız, dilimi tekrar orijinal nesnenin dilimine atayın, bunun gibi

>>> mylist
[1, 2, 3, 4, 5]
>>> mylist[:] = mylist[::-1]
>>> mylist
[5, 4, 3, 2, 1]

Note: reversed actually returns a reverse iterator object, not a list. So, it doesn't build the entire list reversed. Instead it returns elements one by one when iterated with next protocol.

>>> reversed([1, 2, 3, 4, 5])

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

Dolayısıyla, bunun gibi bir jeneratör işlevi yapmak isteyebilirsiniz.

>>> def reverse(mylist):
...     for index in range(len(mylist) - 1, -1, -1):
...         yield mylist[index]
...     
... 
>>> reverse([1, 2, 3, 4, 5])

Böylece reverse işlevi bir jeneratör nesnesi döndürür. Eğer bir liste istiyorsanız, bunun gibi list işleviyle bir tane oluşturabilirsiniz.

>>> list(reverse([1, 2, 3, 4, 5]))
[5, 4, 3, 2, 1]

eğer sadece birer birer işlem yapacaksanız, bunun için for döngüsü ile yineleyin, bunun gibi

>>> for i in reverse([1, 2, 3, 4, 5]):
...     print(i)
...     
... 
5
4
3
2
1
4
katma
@ thefourtheye teşekkürler !!!! bu harika !!!
katma yazar SpicyClubSauce, kaynak
@ abarnert Ah, teşekkürler :-) Güzel bir öneri. Eklemek için düzenleme yaptım. Lütfen kontrol edin :-)
katma yazar thefourtheye, kaynak
Sadece mekanik olarak düzeltmek yerine kodunu yeniden gözden geçirme konusunda bazı harika fikirler. Yapmak isteyebileceğiniz diğer bir öneri, mylist'teki değer için : newlist.insert (0, value) , işleri tersine çevirerek sık sık nasıl basitleştirebileceğinizi göstermek için ( hesaplamanıza gerek yok) len (lst) - index - 1 , ters sırada yineleme yapmak yerine ters sırada eklerseniz).
katma yazar abarnert, kaynak

Öncelikle yapıları geçersiz kılma (kendi durumunda list ), ikinci newlist , 0'dan bir len içeriyor, bu nedenle indeksle erişilemiyor.

def reverse(mylist):
    newlist = [0] * len(mylist)
    index = 0
    while index < len(mylist):
        newlist[index] = mylist[(len(mylist)) - 1 - index]
        index = index + 1
    return newlist

mylist = [1, 2, 3, 4, 5]
print(reverse(mylist))

Giriş listenizle aynı uzunluktaki değerlere sahip bir liste oluşturabilirsiniz.

newlist = [0] * len(mylist)
3
katma

Öncelikle yapıları geçersiz kılma (kendi durumunda list ), ikinci newlist , 0'dan bir len içeriyor, bu nedenle indeksle erişilemiyor.

def reverse(mylist):
    newlist = [0] * len(mylist)
    index = 0
    while index < len(mylist):
        newlist[index] = mylist[(len(mylist)) - 1 - index]
        index = index + 1
    return newlist

mylist = [1, 2, 3, 4, 5]
print(reverse(mylist))

Giriş listenizle aynı uzunluktaki değerlere sahip bir liste oluşturabilirsiniz.

newlist = [0] * len(mylist)
3
katma

Yazmaya çalıştığınız işlevi yazmak için dört gözün cevabını inceleyin.

Ancak bu şekilde değil, reverse çalışır ya da ne yapar? Yeni bir liste oluşturmak yerine, mevcut listeyi yerinde değiştirir.

Eğer düşünürseniz, bu oldukça kolay: sadece endekslerin yarısından geçin, her N endeksi için N'i soldan ve Nth'i sağdan değiştirin. *

Öyleyse, mevcut çerçevenize sadık kalarak:

def reverse(lst):
    index = 0
    while index < len(lst)/2:
        lst[index], lst[len(lst) - 1 - index] = lst[len(lst) - 1 - index], lst[index]
        index = index + 1

Not olarak, while böyle döngüler kullanmak neredeyse her zaman kötü bir fikirdir. Bir sayı aralığı üzerinde döngü yapmak istiyorsanız, dizin içindeki (len (lst)) komutunu kullanın: . Üç kod satırını bire düşürmek ve ne yaptığınızı daha net hale getirmek dışında, basit ancak acı verici bir hata ayıklama hatası yapabileceğiniz çok sayıda yeri kaldırır.

Ayrıca, çoğu durumda Python'da negatif dizini kullanmak için "sağ kenardan" demek, matematiği kendiniz yapmaktan daha kolay olduğunu ve yine de kolayca acı verici bir hata yapabileceğiniz olası bir yeri kaldıracağını unutmayın. Ancak bu özel durumda, aslında daha az hata eğilimli olabilir ...


* Son vakaları düşündüğünüzden emin olmalısınız. Tek listeler için orta öğeyi kendisiyle değiştirip değiştirmemeniz farketmez, ancak yanlış yuvarlamadığınızdan ve bir öğeye çok fazla veya çok kısa gitmediğinizden emin olun. İyi ünite testleri yazmayı öğrenmek için bu harika bir fırsat…

1
katma

Yazmaya çalıştığınız işlevi yazmak için dört gözün cevabını inceleyin.

Ancak bu şekilde değil, reverse çalışır ya da ne yapar? Yeni bir liste oluşturmak yerine, mevcut listeyi yerinde değiştirir.

Eğer düşünürseniz, bu oldukça kolay: sadece endekslerin yarısından geçin, her N endeksi için N'i soldan ve Nth'i sağdan değiştirin. *

Öyleyse, mevcut çerçevenize sadık kalarak:

def reverse(lst):
    index = 0
    while index < len(lst)/2:
        lst[index], lst[len(lst) - 1 - index] = lst[len(lst) - 1 - index], lst[index]
        index = index + 1

Not olarak, while böyle döngüler kullanmak neredeyse her zaman kötü bir fikirdir. Bir sayı aralığı üzerinde döngü yapmak istiyorsanız, dizin içindeki (len (lst)) komutunu kullanın: . Üç kod satırını bire düşürmek ve ne yaptığınızı daha net hale getirmek dışında, basit ancak acı verici bir hata ayıklama hatası yapabileceğiniz çok sayıda yeri kaldırır.

Ayrıca, çoğu durumda Python'da negatif dizini kullanmak için "sağ kenardan" demek, matematiği kendiniz yapmaktan daha kolay olduğunu ve yine de kolayca acı verici bir hata yapabileceğiniz olası bir yeri kaldıracağını unutmayın. Ancak bu özel durumda, aslında daha az hata eğilimli olabilir ...


* Son vakaları düşündüğünüzden emin olmalısınız. Tek listeler için orta öğeyi kendisiyle değiştirip değiştirmemeniz farketmez, ancak yanlış yuvarlamadığınızdan ve bir öğeye çok fazla veya çok kısa gitmediğinizden emin olun. İyi ünite testleri yazmayı öğrenmek için bu harika bir fırsat…

1
katma

0 uzunluklu bir liste için rastgele bir dizine atayamazsınız. Bunu yapmak bir IndexError'u yükseltir. Öğeleri sırayla atadığınızdan, bir dizine atamak yerine yalnızca bir ek yapabilirsiniz:

newlist.append(l[(len(l)) - 1 - index])

Ekle, listeyi değiştirir ve uzunluğunu otomatik olarak artırır.

Orijinal kodunuzu çalıştırmanın başka bir yolu, newlist 'in başlatılmasını değiştirerek dizin işlemlerinizi desteklemek için yeterli uzunluğa sahip olmasıdır:

newlist = [None for _ in range(len(l))]

Ayrıca, yerleşik tür ve işlevlerden sonra bir şeyleri adlandırmanın iyi bir fikir olmadığını da belirtmek isterim. Bunu yapmak, yerleşiklerin işlevselliğini gölgeler.

1
katma

0 uzunluklu bir liste için rastgele bir dizine atayamazsınız. Bunu yapmak bir IndexError'u yükseltir. Öğeleri sırayla atadığınızdan, bir dizine atamak yerine yalnızca bir ek yapabilirsiniz:

newlist.append(l[(len(l)) - 1 - index])

Ekle, listeyi değiştirir ve uzunluğunu otomatik olarak artırır.

Orijinal kodunuzu çalıştırmanın başka bir yolu, newlist 'in başlatılmasını değiştirerek dizin işlemlerinizi desteklemek için yeterli uzunluğa sahip olmasıdır:

newlist = [None for _ in range(len(l))]

Ayrıca, yerleşik tür ve işlevlerden sonra bir şeyleri adlandırmanın iyi bir fikir olmadığını da belirtmek isterim. Bunu yapmak, yerleşiklerin işlevselliğini gölgeler.

1
katma

list.append kullanmanız gerekir. newlist [0] , listede en az bir öğe varsa geçerli bir işlemdir, ancak bu ilk yinelemede newlist boştur. Ayrıca, list , aynı ada sahip bir python yerleşik kabı olduğundan, bir değişken için iyi bir ad değildir:

def reverse(lst):
    newlist = []
    index = 0
    while index < len(lst):
        newlist.append(lst[(len(list)) - 1 - index])
        index += 1
    return newlist

list = [1, 2, 3, 4, 5]
print(reverse(list))
1
katma

list.append kullanmanız gerekir. newlist [0] , listede en az bir öğe varsa geçerli bir işlemdir, ancak bu ilk yinelemede newlist boştur. Ayrıca, list , aynı ada sahip bir python yerleşik kabı olduğundan, bir değişken için iyi bir ad değildir:

def reverse(lst):
    newlist = []
    index = 0
    while index < len(lst):
        newlist.append(lst[(len(list)) - 1 - index])
        index += 1
    return newlist

list = [1, 2, 3, 4, 5]
print(reverse(list))
1
katma

Muhtemelen bunu kontrol et:

def reverse(lst):
     newList = []
     countList = len(lst) - 1
     for x in range(countList,-1,-1):

         newList.append(lst[x])
     return newList

def main():
    lst = [9,8,7,6,5,4,2]
    print(reverse(lst))

main()
0
katma

Muhtemelen bunu kontrol et:

def reverse(lst):
     newList = []
     countList = len(lst) - 1
     for x in range(countList,-1,-1):

         newList.append(lst[x])
     return newList

def main():
    lst = [9,8,7,6,5,4,2]
    print(reverse(lst))

main()
0
katma