Pytanie o del

M8
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:7
0

Witam,

jestem początkujący w Pythonie. Nie rozumiem czemu jak mam listę:

Kopiuj
a = ['zero','jeden','dwa','trzy','cztery']

i jak dam:

Kopiuj
del a[2:4]

to zostaje wywalony nie tylko element 3 (jak powinien) ale też 2 czyli w tym przypadku 'dwa'? Trochę to nie logiczne jak dla mnie bo tym poleceniem chce usunąć wszystko między 2 a 4 elementem, czyli 'trzy' a mi wywala 'dwa' i 'trzy'.

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około 5 godzin
  • Postów:4939
0

Używasz operatora [:], on zwraca wszystko od pierwszego indeksu włącznie i mniejsze od ostatniego(indeksując od zera, oczywiście), np:

Kopiuj
>>> l1 = [1, 2 ,3, 4]
>>> l1[2:4]
[3, 4]

A czemu tak? Tako rzecze Dijkstra:):
https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html


M8
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:7
0
lion137 napisał(a):

Używasz operatora [:], on zwraca wszystko od pierwszego indeksu włącznie i mniejsze od ostatniego(indeksując od zera, oczywiście), np:

Kopiuj
>>> l1 = [1, 2 ,3, 4]
>>> l1[2:4]
[3, 4]

A czemu tak? Tako rzecze Dijkstra:):
https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html

Tzn. rozumiem dlaczego indeksacja jest od 0 ale nie rozumiem, dlaczego jak daje del a[2:4] to wywala mi nie tylko 3 indeks ale też 2. Dla mojej listy polecenie

Kopiuj
a[2:4]
daje
['dwa','trzy']

Co jest dla mnie troche nielogiczne bo [2:4] rozumiem jako wszystko między 2 a 4 indeksem, czyli w tym przypadku 'trzy'. Dlaczego dołącza jeszcze 2 indeks? Specjalnie utworzyłem listę nazywającą indeksy od 0.

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około 5 godzin
  • Postów:4939
1

Bo lista[2:4] zwraca nie to co jest między indeksami 2 i 4, ale większe lub równe od 2 - tego [indeksu] i mniejsze od 4.


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

Bo tak działa ta instrukcja. Lewy indeks jest inclusive bo dzięki temu mozesz zrobić tab[0:n] żeby uwzględnić pierwszy element. Gdyby było tak jak mówisz, to musiałbyś robić tab[-1:n] żeby uwzględnić indeks 0, a fakt że python wspiera ujemne indeksy sprawiłby że ich używanie byłoby totalnie nielogiczne w takie sytuacji.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
MA
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:3
0

Nie wiem, czy to pomoże ale ja [2:4] zrozumiałem jako <2,4) tak jak przy zbiorach w matmie .

Spine
  • Rejestracja:około 22 lata
  • Ostatnio:10 minut
  • Postów:6690
0
Kopiuj
>>> a = ['zero','jeden','dwa','trzy','cztery']
>>> a[2:4]
['dwa', 'trzy']
>>> 

Tak działa interpreter. Logiczne, czy nie, deal with it...

for (int i = 2; i < 4; i++)


🕹️⌨️🖥️🖱️🎮
edytowany 2x, ostatnio: Spine
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Moim zdaniem, różnica indeksów (4 - 2 = 2) powinna być równa ilości pobieranych elementów. W konsekwencji a[2:4] powinno oznaczać listę dwuelementową: 2 i 3 lub 3 i 4. @Shalom podał argument dlaczego powinno być 2 i 3.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

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.