Python 创建大小为“n”的随机列表,其中包含来自另一个列表的元素

Python 创建大小为“n”的随机列表,其中包含来自另一个列表的元素,python,list,random,Python,List,Random,我想创建一个随机字符串,填充S和O。例如,我想要的输出如下: SSOSOOSO OSOOSSOS SSSOOSSO OSOSOSOO 在我的代码中,我会随机更改每一行,那么如何更改每一个位置呢 import random rows = 4 columns = 8 char_list = ['S', 'O'] for i in range(rows): print(random.choice(char_list) * columns) 我的当前输出: SSSSSSSS SSSSSS

我想创建一个随机字符串,填充S和O。例如,我想要的输出如下:

SSOSOOSO
OSOOSSOS
SSSOOSSO
OSOSOSOO
在我的代码中,我会随机更改每一行,那么如何更改每一个位置呢

import random

rows = 4
columns = 8
char_list = ['S', 'O']

for i in range(rows):
    print(random.choice(char_list) * columns)
我的当前输出:

SSSSSSSS
SSSSSSSS
OOOOOOOO
SSSSSSSS

可以使用第二个循环遍历每行中的每一列:

导入python 行数=4 列=8 字符列表=[S,O] 对于rangerows中的i: 行= 对于范围列中的j: 行+=random.choicechar\u列表 打印行
可以使用第二个循环遍历每行中的每一列:

导入python 行数=4 列=8 字符列表=[S,O] 对于rangerows中的i: 行= 对于范围列中的j: 行+=random.choicechar\u列表 打印行
将循环体更改为:

print("".join([random.choice(char_list) for i in range(columns)]))

这样,您就可以在列表的每个循环迭代中调用random.choicechar_list一次=每列每行调用一次,而不是像代码中那样每行只调用一次。

将循环体更改为:

print("".join([random.choice(char_list) for i in range(columns)]))
这样,您就可以在列表理解的每个循环迭代中调用random.choicechar_list一次=每列每行调用一次,而不是像代码中那样每行只调用一次。

与str.join和列表理解一起使用:

from random import choice
L = 8  # length of desired string
''.join([choice('OS') for x in range(L)])
与str.join和列表一起使用:

from random import choice
L = 8  # length of desired string
''.join([choice('OS') for x in range(L)])

使用numpy random.choice,因为它有一个概率选项,您可以为每个选项添加0.5,然后重塑

from numpy.random import choice
choice(['S','O'], 32,
              p=[.5,.5]).reshape((8,4))


array([['O', 'S', 'S', 'O'],
       ['S', 'S', 'S', 'S'],
       ['S', 'S', 'O', 'S'],
       ['O', 'O', 'O', 'S'],
       ['S', 'O', 'O', 'S'],
       ['O', 'O', 'O', 'S'],
       ['O', 'O', 'O', 'O'],
       ['O', 'S', 'S', 'O']], dtype='<U1')

使用numpy random.choice,因为它有一个概率选项,您可以为每个选项添加0.5,然后重塑

from numpy.random import choice
choice(['S','O'], 32,
              p=[.5,.5]).reshape((8,4))


array([['O', 'S', 'S', 'O'],
       ['S', 'S', 'S', 'S'],
       ['S', 'S', 'O', 'S'],
       ['O', 'O', 'O', 'S'],
       ['S', 'O', 'O', 'S'],
       ['O', 'O', 'O', 'S'],
       ['O', 'O', 'O', 'O'],
       ['O', 'S', 'S', 'O']], dtype='<U1')

对于Python 3.6+,只需使用random.choices即可实现这一点:

>>> import random
>>> char_list = ['S', 'O']

>>> random.choices(char_list, k=5)
['S', 'S', 'O', 'S', 'S']
有关更多详细信息,请参阅

因此,您的代码将成为:

import random

rows = 4
columns = 8
char_list = ['S', 'O']

for i in range(rows):
    print(''.join(random.choices(char_list, k=columns)))

# Output:
# SSOSSSSO
# OOSOSOOO
# SSSOOOOO
# OOOOSSSS

对于Python 3.6+,只需使用random.choices即可实现这一点:

>>> import random
>>> char_list = ['S', 'O']

>>> random.choices(char_list, k=5)
['S', 'S', 'O', 'S', 'S']
有关更多详细信息,请参阅

因此,您的代码将成为:

import random

rows = 4
columns = 8
char_list = ['S', 'O']

for i in range(rows):
    print(''.join(random.choices(char_list, k=columns)))

# Output:
# SSOSSSSO
# OOSOSOOO
# SSSOOOOO
# OOOOSSSS

您可以为每一行/每一列随机抽取索引,并使用其中一个字符加载索引,其余的字符加载索引。看起来你想让其中的一半填满S,另一半填满O

类似于以下的事情是可以做到的——这实际上是非常直截了当的。但是,使用numpy库有更有效的方法:

import random

result = []
for i in range(rows):
    indx = random.sample(range(1,columns),columns//2)
    singleRow = []
    for j in range(columns):
        if j in indx:
             singleRow.append('S')
        else:
             singleRow.append('O')
    result.append(singleRow)



您可以为每一行/每一列随机抽取索引,并使用其中一个字符加载索引,其余的字符加载索引。看起来你想让其中的一半填满S,另一半填满O

类似于以下的事情是可以做到的——这实际上是非常直截了当的。但是,使用numpy库有更有效的方法:

import random

result = []
for i in range(rows):
    indx = random.sample(range(1,columns),columns//2)
    singleRow = []
    for j in range(columns):
        if j in indx:
             singleRow.append('S')
        else:
             singleRow.append('O')
    result.append(singleRow)



啊@帖木儿·施塔特兰的类型比我快。萨达尼萨@帖木儿·施塔特兰的类型比我快。sadness代码中的*columns部分不会乘以random.choice的调用,而是单个调用的结果,这就是为什么行中的项是相同的。代码中的*columns部分不会乘以random.choice的调用,而是单个调用的结果,这就是为什么行中的项是相同的。