Hier, j'avais besoin d'un type de matrice en Python.Matrices en Python
Apparemment, une réponse triviale à ce besoin serait d'utiliser numpy.matrix()
, mais le problème supplémentaire que j'ai est que je voudrais qu'une matrice stocke des valeurs arbitraires avec des types mixtes, de manière similaire à une liste. numpy.matrix
ne l'effectue pas. Un exemple est
>>> numpy.matrix([[1,2,3],[4,"5",6]])
matrix([['1', '2', '3'],
['4', '5', '6']],
dtype='|S4')
>>> numpy.matrix([[1,2,3],[4,5,6]])
matrix([[1, 2, 3],
[4, 5, 6]])
Comme vous pouvez le voir, le numpy.matrix
doit être homogène dans le contenu. Si une valeur de chaîne est présente dans mon initialisation, chaque valeur est implicitement stockée en tant que chaîne. Cela est également confirmé en accédant aux valeurs uniques
>>> numpy.matrix([[1,2,3],[4,"5",6]])[1,1]
'5'
>>> numpy.matrix([[1,2,3],[4,"5",6]])[1,2]
'6'
Maintenant, le type de liste Python peut à la place accepter des types mixtes. Vous pouvez avoir une liste contenant un entier et une chaîne, tous deux conservant leur type. Ce dont j'aurais besoin est quelque chose de similaire à une liste, mais opérant dans un comportement semblable à une matrice. Par conséquent, j'ai dû implémenter mon propre type. J'avais deux choix pour l'implémentation interne: liste contenant des listes et dictionnaires. Les deux solutions présentent des inconvénients:
- La liste des listes nécessite une synchronisation minutieuse des tailles des différentes listes. Échanger deux lignes est facile. Échanger deux colonnes est moins facile. Supprimer une rangée est facile aussi.
- Les dictionnaires (avec un tuple comme clé) sont légèrement meilleurs, mais vous devez définir les limites de votre clé (par exemple, vous ne pouvez pas insérer l'élément 5,5 si votre matrice est 3x3) et ils sont plus complexes permet d'insérer, de supprimer ou d'échanger des colonnes ou des lignes.
Édition: clarification. La raison concrète pour laquelle j'ai besoin de cette fonctionnalité est parce que je lis des fichiers CSV. Une fois que je rassemble les valeurs d'un fichier CSV (valeurs qui peuvent être une chaîne, des entiers, des flottants), je voudrais effectuer l'échange, la suppression, l'insertion et d'autres opérations semblables. Pour cette raison j'ai besoin d'une "liste matricielle".
Mes curiosités sont:
- savez-vous si un type de données Python fournissant ce service existe déjà (peut-être dans une bibliothèque « non inclus batterie » là-bas)?
- Pourquoi ce type de données n'est-il pas fourni dans la bibliothèque standard? Un intérêt trop restreint peut-être?
- Comment auriez-vous résolu ce besoin? Dictionnaire, liste ou autre solution plus intelligente?
La raison en est que j'ai besoin de stocker des valeurs arbitraires lues à partir d'un fichier csv, et ces valeurs peuvent être des chaînes, ou des flottants, ou des entiers. Le module csv me permet de lire un fichier csv ligne par ligne, mais pour le stocker en tant que "matrice" c'est à moi de décider. –
Vous ne décrivez aucun type de "matrice" du tout. Vous décrivez une liste de tuples. – kquinn
Oui, c'est. Mais malheureusement, je veux être en mesure d'effectuer des opérations sur cette liste de tuples, similaire aux opérations que je ferais sur une matrice: échange de lignes, échange de colonnes, insertion/suppression de colonnes, etc ... –