2011-03-24 3 views
1

Quelle est la manière la plus rapide de manipuler myInput chaîne afin d'avoir myOutput chaîne?manipulation de chaîne Python en utilisant xrange

myInput = "1,3-5,7" 

myOutput = "1,3,4,5,7" 
+6

Plus rapide que quoi? S'il vous plaît montrer que vous avez au moins essayé. –

+0

Que signifie "x-y"? Tous les nombres entre x et y? – w00t

+0

c'est une quasi-duplication de http://stackoverflow.com/questions/1481192/pythonic-format-for-indices dont la réponse est pour '" 1,3-5,7 "' dans [1,3,4, 5,7] 'doing' ','. Join (réponse (v)) 'à qui donne la réponse à cette question –

Répondre

1
re.sub( 
     "(\d+)-(\d+)" ,   
     lambda x : ",".join(map(str , range(int(x.group(1)) , int(x.group(2)) +1))) , 
     "1,3-5,7") 

Vous pouvez obtenir « 1,3,4,5,7 "

1

Je me souviens d'une question sur le SO qui se [1,3,4,5,7] dans "1,3-5,7", mais je ne me souviens pas qui

c'est la problème inverse:

def expand(s): 
    return ','.join(sum([v if len(v)==1 else map(str, apply(lambda a,b: range(a,b+1), map(int, v))) for v in [p.split('-') for p in s.split(',')]],[])) 

print expand("1,3-5,7") 

impressions:

1,3,4,5,7 
1
>>> def expand(s): 
... for p in s.split(","): 
...  r = p.split("-") 
...  if len(r) == 1: 
...  yield str(r[0]) 
...  else: 
...  for i in range(int(r[0]), int(r[1]) + 1): 
...   yield str(i) 
... 
>>> ",".join(expand("1,3-5,7")) 
'1,3,4,5,7' 
>>> ",".join(expand("1-5,8,10,13-19")) 
'1,2,3,4,5,8,10,13,14,15,16,17,18,19' 

Évidemment, cela échouera de diverses manières intéressantes si l'entrée ne se conforme pas aux hypothèses (lettres, séquences inverse, etc.), et il ne fonctionne pas avec les nombres négatifs.