2010-11-28 4 views

Antwort

1

Hier ist eine Liste basierte Lösung:

import random 

def insert_spaces(s): 
    s = list(s) 
    for i in xrange(len(s)-1): 
     while random.randrange(2): 
      s[i] = s[i] + ' ' 
    return ''.join(s) 
2

Strings in Python sind unveränderlich, so dass Sie sie nicht an Ort und Stelle ändern. Allerdings:

import random 

def insert_space(s): 
    r = random.randint(1, len(s)-1) 
    return s[:r] + ' ' + s[r:] 

def insert_spaces(s): 
    for i in xrange(random.randrange(len(s))): 
     s = insert_space(s) 
    return s 
+0

Ich denke, Umwandeln einer ersten zu einer Liste ist effizienter, so ist es nicht? – eigenein

+0

@eigenein, es kommt darauf an. Ich würde vorschlagen, beides zu versuchen und zu sehen, was schneller ist. –

0

Wenn Sie mehr als einen Raum hinzufügen wollen, dann gehen Sie

s[:r] + ' '*n + s[r:] 
+1

"An zufälligen Positionen" –

+0

addieren Sie r = random.randint (0, len (s)) und das ist getan – Ant

+0

"zufällige positionS" –

1

Ich werde willkürlich entscheiden Sie zwei Räume wollen nie nebeneinander eingesetzt - jeder Punkt Einfügung nur einmal verwendet - und dass "Einfügen" "Anhängen" und "Vorgeben" ausschließt.

zunächst eine Liste der Bestückungspunkten konstruieren ...

insert_points = range (1, len (mystring)) 

eine zufällige Auswahl aus dieser Liste auswählen, und sortieren es ...

import random 
selected = random.sample (insert_points, 5) 
selected.sort() 

Machen Sie eine Liste von Scheiben Ihr String ...

selected.append (len (mystring)) # include the last slice 
temp = 0 # start with first slice 
result = [] 
for i in selected : 
    result.append (mystring [temp:i]) 
    temp = i 

nun die neue Zeichenfolge gebaut ...

" ".join (result) 
+0

Das ist interessant, aber ein bisschen weit weg. =) – eigenein

+0

@eigenein - da war schon mindestens eine vernünftige Antwort, also zielte ich auf die etwas verrückte Nische. FWIW, möglicherweise gibt es eine Möglichkeit, das For-Schleife-Bit zu vermeiden - eine integrierte, die eine Zeichenfolge an bestimmten Positionen aufteilt. Ich habe nicht daran gedacht, nach dem zu suchen. – Steve314

+0

+1 für eine Liste basierte Antwort. –

0

kommt es ...

def thePythonWay(s,n): 
    n = max(0,min(n,25)) 
    where = random.sample(xrange(1,len(s)),n) 
    return ''.join("%2s" if i in where else "%s" for i in xrange(len(s))) % tuple(s) 
1

Nur weil niemand verwendet map noch:

import random 
''.join(map(lambda x:x+' '*random.randint(0,1), s)).strip() 
+0

Eine schöne Lösung. Es ist schade, dass es keine genau definierte Anzahl von Leerzeichen einfügt. – eigenein

0

Wir werden nach dem Zufall wählen die Orte, an denen Räume hinzugefügt werden - nach char 0, 1, ... n-2 der s tring (n-1 ist das letzte Zeichen, und wir werden danach kein Leerzeichen einfügen); und fügen Sie dann die Leerzeichen ein, indem Sie die Zeichen an den angegebenen Stellen durch (das ursprüngliche Zeichen) + 'ersetzen. Dies entspricht der Lösung von Steve314 (d. H. Unter der Annahme, dass Sie keine aufeinanderfolgenden Leerzeichen möchten - was die Gesamtanzahl der verfügbaren Leerzeichen begrenzt), jedoch ohne Verwendung von Listen.

So:

import random 
def insert_random_spaces(original, amount): 
    assert amount > 0 and amount < len(original) 
    insert_positions = sorted(random.sample(xrange(len(original) - 1), amount)) 
    return ''.join(
     x + (' ' if i in insert_positions else '') 
     for (i, x) in enumerate(original) 
    ) 
Verwandte Themen