Skip to content Skip to sidebar Skip to footer

Generating 'random' String From A Different String In Python?

I'm trying to generate a random string using the elements of a different string, with the same length. Ex) String: AGAACGC I want a random string using only elements from the stri

Solution 1:

In Python 3, there is a simple way to print a character without a newline, but in Python 2, there isn't. So, the simplest way to do this is to build up the string, then print it at the end:

result = ''for blah in range(len(seq)): #Apologies for the lame variable namesx = random.randint(0,length - 1)
    result += seq[x]print result

* There are two less simple ways: You can use from __future__ import print_function and then use Python 3 print syntax instead of Python 2, or you can use sys.stdout.write(seq[x]) for each character and then sys.stdout.write('\n') and sys.stdout.flush() at the end. But I don't think you want either of those.


However, there are a number of ways to improve this:

  • Use randrange(length) instead of randint(0, length - 1).
  • Use random.choice(seq) instead of using randrange or randint in the first place.
  • Use _ instead of blah for "don't care" variables.
  • If you don't care about what you're iterating over, just that you're iterating once for each character, just do for _ in seq:, not for _ in range(len(seq)):.
  • Build up a list of letters, then call ''.join() at the end, instead of building up a string.
  • Use a comprehension instead of an explicit loop.

Putting that all together:

print''.join(random.choice(seq) for _ inseq)

* Unless you're using gettext for i18n, or something else that gives _ a special meaning. Most projects that do that come up with their own convention for "don't care" names—maybe __, or dummy. And of course blah would be fine for such a project, as long as you used it consistently.


As for repeating it, your newbish mind is right; just use a loop. For example (taking the second version, but it'll work just as well with the first):

n = 4
for _ in range(n):
    print''.join(random.choice(seq) for _ in range(len(seq)))

That'll print out 4 different random strings. And if you set n to 100, it'll print 100 different random strings.

You may want to write this in a function:

defprint_random_strings(seq, n):
    for _ inrange(n):
        print''.join(random.choice(seq) for _ inrange(len(seq)))

And then you can call it like:

print_random_strings(seq, 4)

But either way, your basic intuition is right on track.

Solution 2:

That's exactly what random.sample is meant for:

import random
seq = 'AGAACGC'"".join(random.sample(seq, len(seq)))
# Gives you something like: 'CGAAACG'

Post a Comment for "Generating 'random' String From A Different String In Python?"