Existe-t-il un meilleur moyen d'extraire des index 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. Il semble beaucoup plus verbeux que l'équivalent Matlab:
a = 0:99;
s = a([6,14,26])
>>> from operator import itemgetter
>>> a = range(100)
>>> itemgetter(5,13,25)(a)
(5, 13, 25)
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 un comparaison de NumPy et Matlab , et voici un tableau des commandes Matlab et leurs équivalents dans NumPy .
Il n'y a pas de méthode "toute faite" - 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 comme les matlabs - cela peut être fait en quelques lignes de code, le fardeau majeur est que vous devrez 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]
Voici une version plus robuste de l'excellent @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_)