Python, Generating random string of brackets

2019-07-03 23:13发布

问题:

I am looking to generate random lengths and patterns of square brackets for example, [] ][ [] ][ [] [[ ]] []

I have so far managed to get my program to generate brackets randomly, but randomly in terms of how many times it generates them, so currently my program is giving me results such as,

[] [] [] [] [] []

[] [] []

[] [] [] [] []

So there is no randomness within the brackets, only randomness in the number of brackets displayed.

I want to know how I can make the order of the brackets random ASWELL as the amount of brackets on show.

Here is my code so far,

import random
import string

def randomGen(N):
    return random.randint(1,N)

char1 = '['
char2 = ']'
finalist = []
newList = []
newList2 = []

newValue = randomGen(99)

for i in range(newValue):
    newList = char1
    newList2 = char2
    finalist.append(newList + newList2)

for everChar in finalist:
    print everChar,

Thanks.

回答1:

You could use random.sample to select the index for where to place, say, left brackets. Then place right-brackets everywhere else:

In [119]: import random

In [122]: N = 10

In [125]: idx = set(random.sample(range(N), N//2))

In [126]: idx
Out[126]: {0, 1, 4, 5, 7}

In [127]: ''.join(['[' if i in idx else ']' for i in range(N)])
Out[127]: '[[]][[][]]'

Given your examples, I assumed you want an equal number of left and right brackets. If not, use jonrsharpe's solution.



回答2:

Well, if you just want to fix your code, you can simply do

finalist = list("".join(finalist))
random.shuffle(finalist)
for everChar in finalist:
    ...

If you want efficient and better ways, please have a look at the other answers.



回答3:

You need to randomly choose from the two characters; you can do this all in one line:

 finallist = [random.choice('[]') for _ in range(random.randint(1, 99))]

You can also simplify the output:

print " ".join(finallist)

An example I just ran:

[ ] ] [ [ [ ] [ ] ] [


回答4:

import random
import string

def randomGen(N):
    return random.randint(1,N)

length_to_generate = randomGen(99)
finalist = []
for i in range(length_to_generate):
    if random.randint(0, 1):
        finalist.append("[")
    else:
        finalist.append("]") 

for everChar in finalist:
    print everChar,

You can also generate a string rather than a list:

length_to_generate = randomGen(99)
finalist = ""
for i in range(length_to_generate):
    if random.randint(0, 1):
        finalist += "]"
    else:
        finalist += "["

print finalist