Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python: Picking an element without replacement

Tags:

python

I would like to slice random letters from a string.

Given s="howdy"

I would like to pick elements from 's' without replacement but keep the index number.

For example

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

is close to what I want, but I would actually prefer something like

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

with letter-index pairs. This is important because the same letter appears in 's' more than once. ie) "letter" where 't' appears twice but I need to distinguish the first 't' from the second.

Ideally I actually only need to generate/pick letters as I need them but scrambling and calculating all the letters at once (ie: in a list as shown above) is ok.

like image 674
wp123 Avatar asked Apr 06 '10 18:04

wp123


3 Answers

>>> random.sample(list(enumerate(a)), 5)
[(1, 'o'), (0, 'h'), (3, 'd'), (2, 'w'), (4, 'y')]
like image 192
interjay Avatar answered Oct 03 '22 00:10

interjay


You could just enumerate the list before sampling:

>>> random.sample(list(enumerate(l)), 5)
[(1, 'o'), (2, 'w'), (0, 'h'), (3, 'd'), (4, 'y')]
like image 40
miles82 Avatar answered Oct 03 '22 01:10

miles82


It's probably easier to do something like this:

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

This will basically shuffle all the indices for a string and then just return the character at that index. Going from character to index is a little more difficult.

like image 34
Daniel DiPaolo Avatar answered Oct 03 '22 00:10

Daniel DiPaolo