Odwracanie listy w pęli for

Odwracanie listy w pęli for
GR
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 lat
  • Postów:14
0

Cześć, czy ktoś był by mi w stanie wyjaśnić dlaczego poniższy kod w pełni działa (obraca poprawnie listę)?

Kopiuj
aList = "Hello World!"
print(aList)

aList = list(aList)
print(aList) 

i = 0

for item in aList[::-1]:
    aList[i] = item
    i+=1

print(aList)
aList = ''.join(aList)
print(aList)

Wydaje mi się, że w takiej sytuacji w pęli for gdy iterator przekroczy połowę liczby wszystkich elementów listy to powinien wskazywać elementy zmodyfikowane podczas pierwszej połowy iteracji, a wygląda to taj jakby iterator operował na liście z przed rozpoczęcia pętli.

edytowany 1x, ostatnio: grudkow
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

To aList[::-1] tworzy kopię listy. W ogóle cały ten kod jest idiotyczny bo samo aList[::-1] już utworzyło ci kopię listy odwróconą i żadna pętla nie jest potrzebna...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
GR
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 lat
  • Postów:14
0
Shalom napisał(a):

To aList[::-1] tworzy kopię listy. W ogóle cały ten kod jest idiotyczny bo samo aList[::-1] już utworzyło ci kopię listy odwróconą i żadna pętla nie jest potrzebna...

Ok dzięki. A to nie jest tak, że 'aList[::-1]' pozwala nam tylko iterować w tył a sama w sobie nie jest odwrócona?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Czemu nie sprawdzimy?

Kopiuj
lista = [1,2,3]
print(id(lista))
print(id(lista[::-1]))

;)
No i dla pewności:

Kopiuj
lista = [1,2,3]
lista2 = lista[::-1]
lista[0] = 5
print(lista2)

Jak widać na liście 2 nie ma żadnej 5.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
0

Nie znam się na Pythonie, ale zobacz: https://docs.python.org/2.3/whatsnew/section-slices.html
Czyli ta konstrukcja tworzy Ci odwróconą kopię listy; zresztą, jest bardziej powerful.


GR
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 lat
  • Postów:14
0

Ok dzięki za rozjaśnienie sytuacji.

Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
1

Tak na marginesie, problemem może (mogło) być, że w tej konstrukcji użyte są nawiasy kwadratowe, które (w innych językach?) używane są zazwyczaj do oznaczania indeksowania listy. Ciekawym przypadkiem jest tu Bash, gdzie zarówno są używane jako operator indeksowania tablicy (http://www.tldp.org/LDP/abs/html/arrays.html), jak i synonim polecenia test (http://www.tldp.org/LDP/abs/html/testconstructs.html)


Guaz
Tak, w pythonie to pozwala pracować na fragmentach list, co przekłada się na dość mocną optymalizację operacji na niej wykonywanej. Na przykład w sicie Eratostenesa, jest to najszybsza pythonowa metoda dostępu :)
Silv
@Guaz: o, dziękuję.
  • Rejestracja:około 6 lat
  • Ostatnio:ponad rok
0
Silv napisał(a):

Tak na marginesie, problemem może (mogło) być, że w tej konstrukcji użyte są nawiasy kwadratowe, które (w innych językach?) używane są zazwyczaj do oznaczania indeksowania listy. Ciekawym przypadkiem jest tu Bash, gdzie zarówno są używane jako operator indeksowania tablicy (http://www.tldp.org/LDP/abs/html/arrays.html), jak i synonim polecenia test (http://www.tldp.org/LDP/abs/html/testconstructs.html)

  1. Nawiasy kwadratowe w Bashu mają więcej zastosowań (cough globbing)
  2. test, wraz z synonimem [, to odpad wstecznej kompatybilności, którego nie używa się w idiomatycznym Bashu
  3. TLDP to nieaktualne i nierzadko just plain wrong źródło wiedzy: korzystaj z https://mywiki.wooledge.org/ oraz https://wiki.bash-hackers.org
edytowany 1x, ostatnio: Mózg
Silv
Dziękuję za uściślenie. :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.