Skip to content

Slicing

Desi supports Python-style slicing for lists and strings.

Basic Slicing

let nums = [10, 20, 30, 40, 50]

# Get elements from index 1 to 3 (exclusive)
let slice1 = nums[1:4]  # [20, 30, 40]

# From beginning to index 2
let slice2 = nums[:3]   # [10, 20, 30]

# From index 2 to end
let slice3 = nums[2:]   # [30, 40, 50]

Negative Indexing

Negative indices count from the end:

let nums = [10, 20, 30, 40, 50]

let last = nums[-1]     # 50 (last element)
let second_last = nums[-2]  # 40

# Last three elements
let last_three = nums[-3:]  # [30, 40, 50]

Step Slicing

Use a third parameter to specify the step:

let nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Every second element
let evens = nums[::2]   # [1, 3, 5, 7, 9]

# Reverse the list
let reversed = nums[::-1]  # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

# Every second element in reverse
let rev_evens = nums[::-2]  # [10, 8, 6, 4, 2]

# Range with step
let ranged = nums[1:7:2]    # [2, 4, 6]

String Slicing

Slicing works the same way for strings:

let s = "Hello, World!"

let hello = s[:5]       # "Hello"
let world = s[7:12]     # "World"
let reversed = s[::-1]  # "!dlroW ,olleH"

Custom Indexing

Classes can implement __getitem__ to support indexing:

class MyList:
    pub data: list[int]

    pub def __new__(self, values: list[int]):
        self.data = values

    pub def __getitem__(self, index: int) -> int:
        return self.data[index]

let arr = MyList([10, 20, 30])
print(arr[0])   # 10
print(arr[-1])  # 30 (negative indexing works!)

Note

Custom classes support negative indexing through __getitem__ - just pass the index to the underlying list.