Python: Somme longueurs de chaîne
Est-il plus idiomatiques façon à la somme des longueurs de chaîne en Python qu'en utilisant une boucle?
length = 0
for string in strings:
length += len(string)
J'ai essayé sum()
, mais il ne fonctionne que pour les entiers:
>>> sum('abc', 'de')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]
Qu'entendez-vous par "plus rapide"? Moins de frappe ou une exécution plus rapide?
Désolé, je pensais "plus rapide" que dans moins de frappe, mais ce que je veux dire, c'est idiomatiques.
Pas de soucis. Je pense que c'est ce que tout le monde figuré. Je suis juste un pédant!
Désolé, je pensais "plus rapide" que dans moins de frappe, mais ce que je veux dire, c'est idiomatiques.
Pas de soucis. Je pense que c'est ce que tout le monde figuré. Je suis juste un pédant!
OriginalL'auteur Zaz | 2010-09-23
Vous devez vous connecter pour publier un commentaire.
Je sais que c'est une vieille question, mais je ne peux m'empêcher de noter que le Python message d'erreur dit comment faire:
Donc:
Je ne sais pas - j'ai depuis longtemps cessé de me demander si le code a été CPU inutile pour les non-temps réel des systèmes. Mais puisque vous avez parlé de "moins de taper" cela ressemble assez serré.
Le gaspillage? C'est de loin le plus rapide des trois solutions, si la
timeit
module est d'être cru. La réponse vous l'avez accepté,sum(len(s) for s in strings)
, est plus de trois fois plus lent, et il est également presque deux fois plus lent quesum(map(len, strings))
. (La vitesse de parcours n'a pas beaucoup d'importance en Python, si vous vouliez vitesse vous seriez à l'aide de Pypy, comme le dit le dicton -- mais le générateur d'expression est aussi l'OMI un peu une horreur par rapport aux autres.)Les autres réponses sont plus génériques et utiles, car elles aussi répondre à la question quand le type de l'élément de la liste n'est pas une chaîne.
Les autres réponses répondre à une question qui ne se posait pas! La question a été sur les listes de chaînes de caractères, la réponse fournie par le message d'erreur. Pourquoi compliquer les choses?
OriginalL'auteur Auspex
Si vous êtes vraiment inquiet à propos de calcul de l'efficacité, vous ne devriez pas utiliser Python, ou d'écrire le calcul-intense en C ou C++ (ou SciPy du tissage de la bibliothèque, si vous êtes courageux). J'aime ce style parce que c'est plus lisible pour les autres développeurs Python.
Merci, c'est beaucoup plus court et plus facile à comprendre que mon code.
OriginalL'auteur liori
Ma première façon de le faire serait
sum(map(len, strings))
. Un autre moyen est d'utiliser une liste de compréhension ou de générateur d'expression que les autres réponses ont posté.La plupart des gens, en effet, trouver le genexp plus pythonic. Je voulais juste ajouter ceci à des fins d'exhaustivité.
OriginalL'auteur Daenyth
Le plus court et le plus rapide est d'appliquer un le style de programmation fonctionnelle avec map() et sum():
En Python 2, utilisez itertools.imap au lieu de carte pour mieux les performances de la mémoire:
OriginalL'auteur Raymond Hettinger
OriginalL'auteur Tony Veijalainen
Voici une autre façon à l'aide de l'opérateur. Pas sûr si cela est plus facile à lire que l'on a accepté la réponse.
OriginalL'auteur sk8asd123
Juste pour ajouter à ...
D'ajouter des numéros à partir d'une liste stockée comme une chaîne de caractères
nos = ['1','14','34']
longueur = somme(int(s) pour s dans nos)
OriginalL'auteur shadab.tughlaq