Tuple Indexing, Combine Slice and Index

Question:

i have got a question about tuple indexing and slicing in python. I want to write better and clearer code. This is a simplified version of my problem:
I have a tuple a = (1,2,3,4,5) and i want to index into it so that i get b = (1,2,4).
Is it possible to do this in one operation or do i have do b = a[0:2] + (a[3],)? I have thought about indexing with another tuple, which is not possible, i have also searched if there is a way to combine a slice and an index. It just seems to me, that there must be a better way to do it.

Thank you very much 🙂

Asked By: Teegrammer

||

Answers:

As stated in the comment you can use itemgetter

import operator
a = (1,2,3,4)
result = operator.itemgetter(0, 1, 3)(a)

If you do this kind of indexing often and your arrays are big, you might also have a look at numpy as it supports more complex indexing schemes:

import numpy as np
a = (1,2,3,4)
b = np.array(a)
result = b[[0,1,3]]

If the array is very large and or you have a huge list of single points you want to include it will get convinient to construct the slicing list in advance. For the example above it will look like this:

singlePoints = [3,]
idx = [*range(0,2), *singlePoints]
result = b[idx]
Answered By: user_na

Just for fun, you can implement an indexer and use simple syntax to get the results:

from collections.abc import Sequence

class SequenceIndexer:

    def __init__(self, seq: Sequence):
        self.seq = seq

    def __getitem__(self, item):
        if not isinstance(item, tuple):
            return self.seq[item]

        result = []
        for i in item:
            v = self.seq[i]
            if not isinstance(i, slice):
                v = v,
            result += v

        return result


a = 1, 2, 3, 4, 5
indexer = SequenceIndexer(a)
print(indexer[:2, 3])            # [1, 2, 4]
print(indexer[:3, 2, 4, -3:])    # [1, 2, 3, 3, 5, 3, 4, 5]
Answered By: Mechanic Pig

you can easily use unpacking but dont name the parameters you dont need you can name them as underscore (_).

one, two, _, four, _ = (1, 2, 3, 4, 5)

now you have your numbers.
this is one simple way.

b = (one, two, four)

or you can use numpy as well.

Answered By: Amosein
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.