2010-04-06 5 views
7

Ich möchte zufällige Buchstaben von einer Zeichenfolge trennen.Python: Ein Element ohne Ersatz auswählen

Da s = „Howdy“

Ich mag würde Elemente zur Auswahl ‚s‘ ohne Ersatz, sondern halten die Indexnummer.

Zum Beispiel

>>> random.sample(s,len(s)) 
['w', 'h', 'o', 'd', 'y'] 

ist in der Nähe, was ich will, aber ich würde tatsächlich so etwas wie

[('w', 2), ('h', 0) bevorzugen, (‘ o ', 1), (' d ', 3), (' y ', 4)]

mit Buchstaben-Index-Paaren. Dies ist wichtig, weil derselbe Buchstabe mehr als einmal in 's' erscheint. dh "Buchstabe", wobei "t" zweimal erscheint, aber ich muss das erste "t" von der zweiten unterscheiden.

Idealerweise brauche ich eigentlich nur Buchstaben zu generieren/auszuwählen, wie ich sie brauche, aber alle Buchstaben auf einmal zu scrambling und zu berechnen (dh in einer Liste wie oben gezeigt) ist in Ordnung.

Antwort

16
>>> random.sample(list(enumerate(a)), 5) 
[(1, 'o'), (0, 'h'), (3, 'd'), (2, 'w'), (4, 'y')] 
8

Sie könnten nur die Liste vor der Probenahme aufzählen:

>>> random.sample(list(enumerate(l)), 5) 
[(1, 'o'), (2, 'w'), (0, 'h'), (3, 'd'), (4, 'y')] 
3

Es ist wahrscheinlich einfacher, so etwas zu tun:

def sample_with_indices(s): 
    indices = range(len(s)) 
    random.shuffle(indices) 
    return [(s[i], i) for i in indices] 

Dies wird grundsätzlich mische alle Indizes für einen String und dann gib einfach das Zeichen an diesem Index zurück. Von Charakter zu Index zu gehen ist etwas schwieriger.

+1

Ich würde etwas ähnliches vorschlagen, aber Sie sollten die 'list (enumerate (s))' Trick oben verwenden: 'return random.shuffle (Liste (enumerate (s)))' – jemfinch

+0

Ja, der einzige Vorteil Dies ist wirklich, wenn Sie stattdessen etwas funky mit der Auswahl der Indizes, die Sie stattdessen verwenden möchten, tun möchten, und dann könnten Sie tun, gefolgt von den letzten zwei Zeilen hier. –