Ik weet dat ik zoiets als string[3:4]
kan gebruiken om een substring in Python te krijgen, maar wat betekent de 3 in somesequence[::3]
?
Antwoord 1, autoriteit 100%
het betekent ‘niets voor het eerste argument, niets voor het tweede, en spring met drie’. Het krijgt elk derde item van de reeks gesegmenteerd.
Uitgebreide segmentenis wat u zoekt. Nieuw in Python 2.3
Antwoord 2, autoriteit 62%
Python sequentie slice-adressen kunnen worden geschreven als a[start:end:step]
en elk van start, stop of end kan worden verwijderd. a[::3]
is elk derde element van de reeks.
Antwoord 3, autoriteit 34%
seq[::n]
is een reeks van elk n
-de item in de hele reeks.
Voorbeeld:
>>> range(10)[::2]
[0, 2, 4, 6, 8]
De syntaxis is:
seq[start:end:step]
Dus je kunt doen (in Python 2):
>>> range(100)[5:18:2]
[5, 7, 9, 11, 13, 15, 17]
Antwoord 4, autoriteit 23%
Uitleg
s[i:j:k]
is, volgens naar de documentatie, “plakje s van i naar j met stap k”. Als i
en j
afwezig zijn, wordt de hele reeks aangenomen en betekent s[::k]
“elk k-de item”.
Voorbeelden
Laten we eerst een lijst initialiseren:
>>> s = range(20)
>>> s
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Laten we elk 3deitem van s
nemen:
>>> s[::3]
[0, 3, 6, 9, 12, 15, 18]
Laten we elk 3deitem van s[2:]
nemen:
>>> s[2:]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> s[2::3]
[2, 5, 8, 11, 14, 17]
Laten we elk 3deitem van s[5:12]
nemen:
>>> s[5:12]
[5, 6, 7, 8, 9, 10, 11]
>>> s[5:12:3]
[5, 8, 11]
Laten we elk 3deitem van s[:10]
nemen:
>>> s[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> s[:10:3]
[0, 3, 6, 9]
Antwoord 5, autoriteit 11%
TL;DR
Dit visuele voorbeeld laat je zien hoe je elementen in een NumPy Matrix (2-dimensionale array) netjes selecteert op een behoorlijk vermakelijke manier (ik beloof het). Stap 2 hieronder illustreert het gebruik van die “dubbele dubbele punt” ::
in kwestie.
(Let op: dit is een specifiek voorbeeld van een NumPy-array met als doel het gebruik van “dubbele dubbele punten” ::
te illustreren voor het springen van elementen in meerdere assen. Dit voorbeeld heeft geen betrekking op native Python-gegevensstructuren zoals List
).
Eén concreet voorbeeld om ze allemaal te regeren…
Stel dat we een NumPy-matrix hebben die er als volgt uitziet:
In [1]: import numpy as np
In [2]: X = np.arange(100).reshape(10,10)
In [3]: X
Out[3]:
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
[50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
[70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
[80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])
Stel dat je baas om de een of andere reden wil dat je de volgende elementen selecteert:
“Maar hoe???”… Lees verder! (We kunnen dit in twee stappen doen)
Stap 1 – Subset verkrijgen
Geef de “startindex” en “eindindex” op in zowel rij- als kolomrichtingen.
In code:
In [5]: X2 = X[2:9,3:8]
In [6]: X2
Out[6]:
array([[23, 24, 25, 26, 27],
[33, 34, 35, 36, 37],
[43, 44, 45, 46, 47],
[53, 54, 55, 56, 57],
[63, 64, 65, 66, 67],
[73, 74, 75, 76, 77],
[83, 84, 85, 86, 87]])
Merk op dat we zojuist onze subset hebben verkregen, met behulp van een eenvoudige begin- en eindindexeringstechniek. Vervolgens, hoe doe je dat “springen”… (lees verder!)
Stap 2 – Selecteer elementen (met het argument “jump step”)
We kunnen nu de “springstappen” specificeren in zowel rijgewijze als kolomgewijze richtingen (om elementen op een “springende” manier te selecteren) als volgt:
in code (noteer de dubbele colos):
In [7]: X3 = X2[::3, ::2]
In [8]: X3
Out[8]:
array([[23, 25, 27],
[53, 55, 57],
[83, 85, 87]])
We hebben zojuist alle elementen geselecteerd zoals vereist! 🙂
& NBSP; consolideren Stap 1 (begin en einde) en stap 2 (“Jumping”)
Nu weten we het concept, we kunnen eenvoudig stap 1 en stap 2 combineren in één geconsolideerde stap – voor compactheid:
In [9]: X4 = X[2:9,3:8][::3,::2]
In [10]: X4
Out[10]:
array([[23, 25, 27],
[53, 55, 57],
[83, 85, 87]])
klaar!
6, Autoriteit 2%
U kunt deze notatie ook gebruiken in uw eigen aangepaste klassen om het te laten doen wat u wilt
class C(object):
def __getitem__(self, k):
return k
# Single argument is passed directly.
assert C()[0] == 0
# Multiple indices generate a tuple.
assert C()[0, 1] == (0, 1)
# Slice notation generates a slice object.
assert C()[1:2:3] == slice(1, 2, 3)
# If you omit any part of the slice notation, it becomes None.
assert C()[:] == slice(None, None, None)
assert C()[::] == slice(None, None, None)
assert C()[1::] == slice(1, None, None)
assert C()[:2:] == slice(None, 2, None)
assert C()[::3] == slice(None, None, 3)
# Tuple with a slice object:
assert C()[:, 1] == (slice(None, None, None), 1)
# Ellipsis class object.
assert C()[...] == Ellipsis
We kunnen dan segmentobjecten openen als:
s = slice(1, 2, 3)
assert s.start == 1
assert s.stop == 2
assert s.step == 3
Dit wordt met name gebruikt in Numpy om multidimensionale arrays in elke richting te snijden.
Natuurlijk zou elke normale API ::3
moeten gebruiken met de gebruikelijke “elke 3”-semantiek.
De gerelateerde Ellipsis
wordt verder behandeld op: Wat doet het Ellipsis-object?
Antwoord 7, autoriteit 2%
De derde parameter is de stap. Dus [::3] zou elk 3e element van de lijst/tekenreeks teruggeven.
Antwoord 8
Python gebruikt de :: om de End-, Start- en Step-waarde te scheiden.
Antwoord 9
Heb ik het gemist of heeft niemand het over achteruitrijden met [::-1]
hier?
# Operating System List
systems = ['Windows', 'macOS', 'Linux']
print('Original List:', systems)
# Reversing a list
#Syntax: reversed_list = systems[start:stop:step]
reversed_list = systems[::-1]
# updated list
print('Updated List:', reversed_list)
bron:
https://www.programiz.com/python-programming/methods/list/ achteruit
Antwoord 10
onthoud dat de basis is wat a[start:end:step]
betekent. Van daaruit kun je a[1::2]
krijgen elke oneven index, a[::2]
elke even krijgen, a[2::2]
haal elke even vanaf 2, a[2:4:2]
haal elke even vanaf 2 en eindigend bij 4. Geïnspireerd door https://stackoverflow.com/a/3453102/1601580