2010-12-07 3 views
2

Étant donné "a.b.c.d.e", je souhaite obtenir toutes les sous-arborescences, de manière efficace, par ex. "b.c.d.e" et "c.d.e", mais pas "a.d.e" ou "b.c.d".Obtenir toutes les sous-arborescences en valeur

situation mondiale réel:

Je foo.bar.baz.example.com et je veux tous les arbres possibles sous-domaines.

Répondre

5
listed = "a.b.c.d.e".split('.') 
subtrees = ['.'.join(listed[idx:]) for idx in xrange(len(listed))] 

Compte tenu de vos données d'échantillon, est égal à ['a.b.c.d.e', 'b.c.d.e', 'c.d.e', 'd.e', 'e'] sous-arbres.

2
def parts(s, sep): 
    while True: 
     yield s 
     try: 
      # cut the string after the next sep 
      s = s[s.index(sep)+1:] 
     except ValueError: 
      # no `sep` left 
      break 

print list(parts("a.b.c.d.e", '.')) 
# ['a.b.c.d.e', 'b.c.d.e', 'c.d.e', 'd.e', 'e'] 
0

Vous ne savez pas si c'est ce que vous voulez. Mais le découpage de la liste avec des tailles différentes permet d'obtenir ce résultat.

>>> x = "a.b.c.d.e" 
>>> k = x.split('.') 
>>> k 
['a', 'b', 'c', 'd', 'e'] 
>>> l = [] 
>>> for el in range(len(k)): l.append(k[el+1:]) 
... 
>>> l 
[['b', 'c', 'd', 'e'], ['c', 'd', 'e'], ['d', 'e'], ['e'], []] 
>>> [".".join(l1) for l1 in l if l1] 
['b.c.d.e', 'c.d.e', 'd.e', 'e'] 
>>> 

Bien sûr, ce qui précède était d'illustrer le processus. Vous pouvez les combiner en un seul paquebot.

[Edit: Je pensais que la réponse est la même que tout ici et explique bien]

+0

Quel est le problème avec ma réponse !! Quelqu'un peut-il me le dire. – pyfunc

3
items = data.split('.') 
['.'.join(items[i:]) for i in range(0, len(items))] 
Questions connexes