68 votes

Découpage de liste Python avec des indices arbitraires

Existe-t-il un meilleur moyen d'extraire des indices arbitraires d'une liste en python?

La méthode que j'utilise actuellement est :

 a = range(100)
s = [a[i] for i in [5,13,25]]

Où a est le tableau que je veux découper et [5,13,25] sont les éléments que je veux obtenir. Cela semble beaucoup plus verbeux que l'équivalent Matlab :

 a = 0:99;
s = a([6,14,26])

77voto

gnibbler Points 103484
>>> from operator import itemgetter
>>> a = range(100)
>>> itemgetter(5,13,25)(a)
(5, 13, 25)

37voto

unutbu Points 222216

Si vous êtes un utilisateur de Matlab, mais que vous souhaitez utiliser Python, consultez numpy :

 In [37]: import numpy as np

In [38]: a = np.arange(100)

In [39]: s = a[[5,13,25]]

In [40]: s
Out[40]: array([ 5, 13, 25])

Voici une comparaison de NumPy et Matlab , et voici un tableau des commandes Matlab courantes et leurs équivalents dans NumPy .

14voto

jsbueno Points 22212

Il n'y a pas de moyen "tout fait" - la façon dont vous le faites est assez ingénue et vous pouvez l'utiliser. Si vous en avez beaucoup dans votre code, vous voudrez peut-être utiliser une sous-classe de liste qui utiliserait une syntaxe similaire à celle de matlabs - cela peut être fait en quelques lignes de code, le principal fardeau est que vous deviez travailler utilisez toujours cette nouvelle classe au lieu des listes intégrées.

 class MyList(list):
    def __getitem__(self, index):
        if not isinstance(index, tuple):
            return list.__getitem__(self, index)
        return [self[i] for i in index]

Et sur la console :

 >>> m = MyList(i * 3 for i in range(100))
>>> m[20, 25,60]
[60, 75, 180]

5voto

Denis Golomazov Points 1211

Voici une version plus robuste de l'excellent accepté @John La Rooy réponse . Il passe les doctests fournis. Il renvoie toujours une liste.

 def slice_by_index(lst, indexes):
    """Slice list by positional indexes.

    Adapted from https://stackoverflow.com/a/9108109/304209.

    Args:
        lst: list to slice.
        indexes: iterable of 0-based indexes of the list positions to return.

    Returns:
        a new list containing elements of lst on positions specified by indexes.

    >>> slice_by_index([], [])
    []
    >>> slice_by_index([], [0, 1])
    []
    >>> slice_by_index(['a', 'b', 'c'], [])
    []
    >>> slice_by_index(['a', 'b', 'c'], [0, 2])
    ['a', 'c']
    >>> slice_by_index(['a', 'b', 'c'], [0, 1])
    ['a', 'b']
    >>> slice_by_index(['a', 'b', 'c'], [1])
    ['b']
    """
    if not lst or not indexes:
        return []
    slice_ = itemgetter(*indexes)(lst)
    if len(indexes) == 1:
        return [slice_]
    return list(slice_)

0voto

Joel Cornett Points 10475

Il semble que vous feriez :

     a = list(range(99)) 
    s = [a[5], a[13], a[25]] 

cela semble être presque identique à la version matlab.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X