2013-05-14 3 views
1

J'ai une fonction qui reçoit une chaîne délimitée par des points. Je veux parcourir cette valeur en la construisant et en exécutant du code pour chaque niveau. Voici une mise en œuvre:implémentation plus simple de cette boucle de fractionnement de chaîne

def example(name): 
    module = [] 
    for i in name.split('.'): 
     module.append(i) 
     print '.'.join(module) 
     #do some stuff here 

sortie

>>> example('a.b.c.d') 
a 
a.b 
a.b.c 
a.b.c.d 

Mais il se sent très longue haleine. Je suis à la recherche d'une implémentation plus simple, plus propre ou plus courte.

+0

Pour général '#Ne certains here' stuff, je pense que c'est la bonne approche. – chepner

+0

Cela me semble assez propre. Vous pourriez être en mesure de le rendre plus court, mais je ne pense pas que vous pouvez le rendre plus facile à lire. – maxy

Répondre

5

diviser une fois, puis il tranche:

s = 'a.b.c.d' 

items = s.split('.') 
print [items[:i] for i in xrange(1, len(items) + 1)] 
# [['a'], ['a', 'b'], ['a', 'b', 'c'], ['a', 'b', 'c', 'd']] 
+1

Qu'en est-il du reste du corps de la boucle dans son exemple? – chepner

0

Si vous utilisez Python 3, vous devez utiliser itertools.accumulate comme ceci:

>>> from itertools import accumulate 
>>> txt = 'a.b.c.d' 
>>> list(accumulate(txt.split('.'), lambda x,y: x + '.' + y)) 
['a', 'a.b', 'a.b.c', 'a.b.c.d'] 
>>> def example(txt): 
    for module in accumulate(txt.split('.'), lambda x,y: x + '.' + y): 
     print('Done stuff with %r' % module) 

>>> example('a.b.c.d') 
Done stuff with 'a' 
Done stuff with 'a.b' 
Done stuff with 'a.b.c' 
Done stuff with 'a.b.c.d' 
>>> 
Questions connexes