2010-12-15 103 views
1

Ceci est rapide. Supposons que j'ai une liste multidimensionnelle d'objets de classe, nommée table, et que j'ai besoin d'accéder à l'attribut de classe .name.Python: extension de la liste des objets de classe

Je ne veux pas utiliser de boucles imbriquées, et bien sûr pour imprimer cela, j'ai besoin d'utiliser format().

for i in range(3): 
    print '{0} - {1} - {2}'.format(*table[i].name) 

De toute évidence, cela n'a pas fonctionné. Ainsi que (*table[i]).name. Je dois être en mesure d'accéder à .name pour chaque objet de classe dans la liste table[i]. Ça te dérange si tu me mets dans la bonne direction? Merci d'avance.

+1

Pourquoi ne voulez-vous pas utiliser pour les boucles imbriquées? Vous devrez traverser tous les éléments de toute façon. Vous ne vous enregistrez pas les opérations. – Falmarri

Répondre

1

Comme cela, par exemple:

for row in table: 
    print '{0} - {1} - {2}'.format(*[x.name for x in row]) 
+0

Parfait. Merci. – Ruel

1

Je ne veux pas utiliser des boucles imbriquées

C'est ridicule. Pour parcourir chaque élément d'un tableau multidimensionnel, a besoin de pour utiliser des boucles imbriquées. Ils peuvent être implicites (map ou une compréhension de liste) mais cela ne veut pas dire qu'ils ne sont pas là! Ce qui suit va être beaucoup plus propre et plus propre que tout avec map ou un méchant format déballage.

for row in table: 
    for elt in row: 
     print <...> 

Si vous voulez vraiment savoir comment utiliser votre méthode:

import operator 
for row in table: 
    print '{0} - {1} - {2}'.format(*map(operator.attrgetter('name'), row)) 

Dites-moi ce n'est pas salissant et peu claires par rapport à ce qui précède, sans parler du fait que vous avez codé en dur dans la constante magique 3 - et si vous voulez passer à une table 4x4?