Wat is :: (dubbele dubbele punt) in Python bij het subscripten van reeksen?

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 ien jafwezig 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 snemen:

>>> 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 ::3moeten gebruiken met de gebruikelijke “elke 3”-semantiek.

De gerelateerde Ellipsiswordt 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

Other episodes