-3
votes

Obtenir la colonne d'une matrice composée de tuples

Je ne sais pas comment atteindre l'index des tuples et les regrouper dans un seul tuple. Ma fonction reçoit une matrice 3x3, mon tab et un entier qui correspond à l'index de la colonne de la matrice.


2 commentaires

Question de niveau vraiment débutant, désolé mais SO n'est pas là pour résoudre le problème des devoirs, veuillez nous montrer votre approche pour résoudre ce problème particulier.


Je me demande si la partie sur la levée d'une exception ValueError est une partie fondamentale de vos exigences ... si j'essaie la réponse acceptée avec n=4 , comme dans votre spécification, alors je reçois un message d'erreur différent "IndexError: tuple index out of range"


3 Réponses :


1
votes

Pas sûr de ce qui vous bloque, c'est la même chose que l'indexation dans une liste de listes:

(1, 1, 1)
(-1, 0, -1)
(0, -1, 0)

sortie des colonnes:

def obtain_column(tab, c):
    return tuple(row[c] for row in tab)
    # take element at position c in each row, and make a tuple


tab = ((1,-1,0),
       (1,0,-1),
       (1,-1,0))

print(obtain_column(tab, 0))
print(obtain_column(tab, 1))
print(obtain_column(tab, 2))


2 commentaires

Merci pour votre réponse et votre temps! Cela m'aide beaucoup! En fait, un moyen simple de le faire. Faire de même pour les lignes de la matrice.


Cool, vous êtes les bienvenus. Pour les lignes, vous pouvez obtenir directement la ligne entière avec tab[r]



0
votes

Vous pouvez faire quelque chose comme ceci:

ret = ()

for row in tab:
    ret += (row[c],)  # the , is for adding the integer as a tuple element.

return ret

Notez que le code ci-dessus suppose que chaque tuple a un élément dans l'index c. Vous devrez peut-être ajouter quelque chose pour vérifier cela, en fonction de votre programme complet.


1 commentaires

Reportez-vous à la réponse de Reblochon Masque, c'est plus "python-y". Ceci est une démonstration du processus de création du nouveau tuple, au lieu d'utiliser un one-liner.



0
votes

Ce que tu veux peut être fait

  1. transposer le tuple de tuples à l'aide de l'idiome zip(*iterable) bien connu zip(*iterable) pour obtenir les colonnes de tab comme les éléments de l'objet zip ,
  2. puis dans une compréhension de liste nous comptons les objets de colonne à partir de 1 et nous rejetons toutes les colonnes dont le nombre ne correspond pas à n
  3. si un nombre de colonnes correspond, le seul élément de la liste col est le tuple, généré par zip(*tab) correspondant à la colonne demandée
  4. si col n'est pas la liste vide, nous pouvons retourner son élément unique - la colonne demandée sous forme de tuple
  5. sinon aucun nombre de colonnes ne correspond à n , col est la liste nulle, nous ne return pas et nous devons donc lever une ValueError , selon votre spécification

donc

In [35]: def obtain_column(t, n):
    ...:     col = [c for i, c in enumerate(zip(*tab), 1) if i==n]
    ...:     if col : return col[0]
    ...:     raise ValueError('obtain_column: invalid argument %d.'%n)
    ...: for i in (1,2,4): print(obtain_column(tab, i))
(1, 1, 1)
(-1, 0, -1)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-35-1c03f33aa1cf> in <module>
      3     if col : return col[0]
      4     raise ValueError('obtain_column: invalid argument %d.'%n)
----> 5 for i in (1,2,4): print(obtain_column(tab, i))

<ipython-input-35-1c03f33aa1cf> in obtain_column(t, n)
      2     col = [c for i, c in enumerate(zip(*tab), 1) if i==n]
      3     if col : return col[0]
----> 4     raise ValueError('obtain_column: invalid argument %d.'%n)
      5 for i in (1,2,4): print(obtain_column(tab, i))

ValueError: obtain_column: invalid argument 4.

In [36]:


0 commentaires