Sök…


Syntax

  • obj [start: stopp: steg]
  • slice (stopp)
  • skiva (start, stopp [, steg])

parametrar

Paramer Beskrivning
obj Objektet som du vill extrahera ett "underobjekt" från
start Indexet för obj som du vill att obj ska börja från (tänk på att Python är nollindexerat, vilket innebär att det första objektet i obj har ett index på 0 ). Om utelämnats är standardvärdet 0 .
stop (Inklusive) indexet för obj som du vill att obj ska sluta på. Om utelämnad, är standard inte len(obj) .
step Här kan du välja bara varje step objekt. Om utelämnats är standardvärdet 1 .

Anmärkningar

Du kan förena konceptet att skära strängar med det att skära andra sekvenser genom att se strängar som en oändlig karaktärssamling, med förbehållet att ett unicode-tecken representeras av en sträng med längd 1.

I matematisk notation kan du överväga att skära för att använda ett halvöppet intervall på [start, end) , det vill säga att starten är inkluderad men slutet inte. Den halvöppna naturen hos intervallet har fördelen att len(x[:n]) = n där len(x) > = n , medan intervallet som stängs i början har fördelen att x[n:n+1] = [x[n]] där x är en lista med len(x) >= n , vilket håller konsistensen mellan indexering och skivningsnotation.

Grundläggande skivning

För alla iterabla (för t.ex. en sträng, lista osv.) Låter Python dig skiva och returnera en substring eller underlista över dess data.

Format för skivning:

iterable_name[start:stop:step]

var,

  • start är skivans första index. Standardvärdet till 0 (indexet för det första elementet)
  • stop en förbi skivets sista index. Standardvärde för len (iterable)
  • step är stegstorleken (bättre förklaras av exemplen nedan)

Exempel:

a = "abcdef"
a            # "abcdef" 
             # Same as a[:] or a[::] since it uses the defaults for all three indices
a[-1]        # "f"
a[:]         # "abcdef" 
a[::]        # "abcdef" 
a[3:]        # "def" (from index 3, to end(defaults to size of iterable)) 
a[:4]        # "abcd" (from beginning(default 0) to position 4 (excluded)) 
a[2:4]       # "cd" (from position 2, to position 4 (excluded)) 

Dessutom kan vilken som helst av ovanstående användas med stegstorleken definierad:

a[::2]       # "ace" (every 2nd element)
a[1:4:2]     # "bd" (from index 1, to index 4 (excluded), every 2nd element)

Index kan vara negativa, i vilket fall beräknas de från slutet av sekvensen

a[:-1]     # "abcde" (from index 0 (default), to the second last element (last element - 1))
a[:-2]     # "abcd" (from index 0 (default), to the third last element (last element -2))
a[-1:]     # "f" (from the last element to the end (default len()) 

Stegstorlekar kan också vara negativa, i vilket fall skivan kommer att upprepas genom listan i omvänd ordning:

a[3:1:-1]   # "dc" (from index 2 to None (default), in reverse order)

Denna konstruktion är användbar för att vända en iterable

a[::-1]     # "fedcba" (from last element (default len()-1), to first, in reverse order(-1))

Observera att för negativa steg är standard end_index None (se http://stackoverflow.com/a/12521981 )

a[5:None:-1] # "fedcba" (this is equivalent to a[::-1])
a[5:0:-1]    # "fedcb" (from the last element (index 5) to second element (index 1)

Gör en ytlig kopia av en matris

Ett snabbt sätt att göra en kopia av en matris (i motsats till att tilldela en variabel med en annan referens till den ursprungliga matrisen) är:

arr[:]

Låt oss undersöka syntaxen. [:] betyder att alla start , end och slice utelämnas. De har som standard 0 , len(arr) respektive 1 , vilket innebär att subarray som vi begär kommer att ha alla elementen i arr från början till slutet.

I praktiken ser det ut som:

arr = ['a', 'b', 'c']
copy = arr[:]
arr.append('d')
print(arr)    # ['a', 'b', 'c', 'd']
print(copy)   # ['a', 'b', 'c']

Som ni kan arr.append('d') d till arr , men copy förblev oförändrad!

Observera att detta gör en ytlig kopia och är identisk med arr.copy() .

Omvända ett objekt

Du kan använda skivor för att mycket enkelt vända en str , list eller tuple (eller i princip alla samlingsobjekt som implementerar skivning med stegparametern). Här är ett exempel på att vända en sträng, även om detta gäller lika för de andra typerna ovan:

s = 'reverse me!'
s[::-1]    # '!em esrever'

Låt oss snabbt titta på syntaxen. [::-1] betyder att skivan bör vara från början till slutet av strängen (eftersom start och end är utelämnad) och ett steg på -1 betyder att det bör röra sig genom strängen i omvänd riktning.

Indexera anpassade klasser: __getitem__, __setitem__ och __delitem__

class MultiIndexingList:
    def __init__(self, value):
        self.value = value
        
    def __repr__(self):
        return repr(self.value)
    
    def __getitem__(self, item):
        if isinstance(item, (int, slice)):
            return self.__class__(self.value[item])
        return [self.value[i] for i in item]
    
    def __setitem__(self, item, value):
        if isinstance(item, int):
            self.value[item] = value
        elif isinstance(item, slice):
            raise ValueError('Cannot interpret slice with multiindexing')
        else:
            for i in item:
                if isinstance(i, slice):
                    raise ValueError('Cannot interpret slice with multiindexing')
                self.value[i] = value
    
    def __delitem__(self, item):
        if isinstance(item, int):
            del self.value[item]
        elif isinstance(item, slice):
            del self.value[item]
        else:
            if any(isinstance(elem, slice) for elem in item):
                raise ValueError('Cannot interpret slice with multiindexing')
            item = sorted(item, reverse=True)
            for elem in item:
                del self.value[elem]

Detta tillåter skärning och indexering för elementåtkomst:

a = MultiIndexingList([1,2,3,4,5,6,7,8])
a
# Out: [1, 2, 3, 4, 5, 6, 7, 8]
a[1,5,2,6,1]
# Out: [2, 6, 3, 7, 2]
a[4, 1, 5:, 2, ::2]
# Out: [5, 2, [6, 7, 8], 3, [1, 3, 5, 7]]
#       4|1-|----50:---|2-|-----::2-----   <-- indicated which element came from which index

Medan inställning och radering av element endast tillåts komma-separerad heltalindexering (ingen skivning):

a[4] = 1000
a
# Out: [1, 2, 3, 4, 1000, 6, 7, 8]
a[2,6,1] = 100
a
# Out: [1, 100, 100, 4, 1000, 6, 100, 8]
del a[5]
a
# Out: [1, 100, 100, 4, 1000, 100, 8]
del a[4,2,5]
a
# Out: [1, 100, 4, 8]

Skiva tilldelning

En annan snygg funktion med skivor är skivtilldelning. Python låter dig tilldela nya skivor för att ersätta gamla skivor i en lista i en enda operation.

Detta innebär att om du har en lista kan du ersätta flera medlemmar i en enda tilldelning:

lst = [1, 2, 3]
lst[1:3] = [4, 5]
print(lst) # Out: [1, 4, 5]

Uppgiften ska inte matcha i storlek också, så om du ville ersätta en gammal skiva med en ny skiva som är annorlunda i storlek kan du:

lst = [1, 2, 3, 4, 5]
lst[1:4] = [6]
print(lst) # Out: [1, 6, 5]

Det är också möjligt att använda den kända skivsyntaxen för att göra saker som att ersätta hela listan:

lst = [1, 2, 3]
lst[:] = [4, 5, 6]
print(lst) # Out: [4, 5, 6]

Eller bara de två sista medlemmarna:

lst = [1, 2, 3]
lst[-2:] = [4, 5, 6]
print(lst) # Out: [1, 4, 5, 6]

Skiva föremål

Skivor är föremål i sig själva och kan lagras i variabler med den inbyggda slice() . Skivvariabler kan användas för att göra din kod mer läsbar och för att främja återanvändning.

>>> programmer_1 = [ 1956, 'Guido', 'van Rossum', 'Python', 'Netherlands']
>>> programmer_2 = [ 1815, 'Ada', 'Lovelace', 'Analytical Engine', 'England']
>>> name_columns = slice(1, 3)
>>> programmer_1[name_columns]
['Guido', 'van Rossum']
>>> programmer_2[name_columns]
['Ada', 'Lovelace']

Grundläggande indexering

Python-listor är 0-baserade, dvs det första elementet i listan kan nås av index 0

arr = ['a', 'b', 'c', 'd']
print(arr[0])
>> 'a'

Du kan komma åt det andra elementet i listan med index 1 , tredje elementet med index 2 och så vidare:

print(arr[1])
>> 'b'
print(arr[2])
>> 'c'

Du kan också använda negativa index för att komma åt element från slutet av listan. t.ex. index -1 ger dig det sista elementet i listan och index -2 ger dig det näst till sista elementet i listan:

print(arr[-1])
>> 'd'
print(arr[-2])
>> 'c'

Om du försöker komma åt ett index som inte finns i listan kommer en IndexError att höjas:

print arr[6]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow