2012-12-06 2 views
2

Supposons une liste de tuples, avec le contenu de longueur arbitraire:Bref aperçu du contenu de la liste des tuples

quotes = [('Shakespeare', 'Piccard', 'Allen'), 
      ("To be, or not to be", "Earl Grey, 60 degrees", "I feel that life is divided into the horrible and the miserable. That's the two categories. The horrible are like, I don't know, terminal cases, you know, and blind people, crippled. I don't know how they get through life. It's amazing to me. And the miserable is everyone else. So you should be thankful that you're miserable, because that's very lucky, to be miserable."), 
      ('beer', 'tea', 'vodka') 
     ] 

Pour des fins de débogage, je voudrais sortir le contenu de la liste:

print str(quotes) 

Cependant, je voudrais seulement les N premiers caractères de n'importe quelle valeur de tuple, je n'ai pas besoin du contenu entier s'il est long comme dans la troisième citation. Je sais que je pourrais écrire une fonction pour itérer sur la liste et ensuite pour itérer sur chaque tuple et découper les N premiers caractères, mais étant Python, je soupçonne qu'il y a un chemin plus simple, plus court, plus pythonique. Y a-t-il?

Je ne cherche pas de solution XY pour l'exemple actuel, c'est juste un exemple pour illustrer un point.

+0

Vous cherchez une compréhension de liste avec une jointure, alors? – Crisfole

+0

Qu'est-ce qui vous fait penser qu'une telle fonction n'est pas "Pythonic"? ["La lisibilité compte."] (Http://www.python.org/dev/peps/pep-0020/) – Johnsyweb

+0

Merci, Johnsyweb. Je pensais réellement à citer "Simple est mieux que complexe". comme la fonction serait quatre ou cinq niveaux de retrait vers le bas. De mon expérience limitée, en Python, s'il y a plus de trois niveaux de retrait, alors Guido a déjà trouvé un meilleur moyen. – dotancohen

Répondre

3

Je ne sais pas si cela est suffisant pythonique, mais encore:

N = 10 
map(lambda t: map(lambda s: s[:N], t), quotes) 
+0

Nice, merci! Cela renvoie effectivement une liste de listes, mais je peux travailler avec cela. Double merci de me présenter les fonctions lambda. – dotancohen

1

Je vais essayer PrettyPrinter le sous-classement. En feuilletant la source, il semble que la méthode que vous souhaitez remplacer est format(self, object, context, maxlevels, level):

import pprint 

class TruncatingPrettyPrinter(pprint.PrettyPrinter): 
    def format(self, object, context, maxlevels, level): 
     if isinstance(object, basestring): 
      object = object[:72]+"..." # shorten strings to under 80 chars 

     return pprint.PrettyPrinter.format(self, object, context, maxlevels, level) 

TruncatingPrettyPrinter().pprint(quotes) 

Cela ne fait pas exactement les mêmes que print str(quotes) parce que pprint enveloppements et structures aligne. Il ne tronque que les chaînes dans le graphe d'objets d'origine, au lieu des représentations de chaînes résultantes de toutes les autres structures, mais il fait le travail de base (ne pas avoir de sortie trop large).

+0

Merci, millimoose. Comme je l'ai mentionné dans le PO, je cherche quelque chose d'un peu plus simple, sans écrire une méthode/fonction. Mais ceci est un excellent exemple d'une méthode prioritaire et sera certainement utile dans un état en cours. Merci beaucoup! – dotancohen

+0

@dotancohen Mon raisonnement était plus que "si vous voulez changer la façon dont les objets sont formatés, il y a un endroit qui fournit des hooks pour ce mécanisme". Malheureusement, ce n'est pas un formatage de chaîne intégré, ce qui rend cette approche pas très "légère". C'est une option, mais je sais que ce n'est peut-être pas celui que vous voulez. – millimoose

Questions connexes