【问题标题】:Create random list of size "n" containing elements from another list创建包含来自另一个列表的元素的大小为“n”的随机列表
【发布时间】:2020-12-30 21:17:40
【问题描述】:

我想创建用“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

【问题讨论】:

  • 代码中的* columns部分不会乘以random.choice()call,而是单个调用的result,那就是为什么这些项目在一行中是相同的。

标签: python list random


【解决方案1】:

对于 Python 3.6+,您可以简单地使用 random.choices() 来实现:

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

>>> random.choices(char_list, k=5)
['S', 'S', 'O', 'S', 'S']

更多详情请参考"random.choices()" document


因此您的代码将变为:

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

【讨论】:

    【解决方案2】:

    把循环体改成这样:

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

    这样,您在列表理解的每个循环迭代中调用一次random.choice(char_list)(= 每行每列一次),而不是像您的代码中那样每行只调用一次。

    【讨论】:

      【解决方案3】:

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

      import python
      
      
      rows = 4
      columns = 8
      char_list = ["S", "O"]
      
      for i in range(rows):
          row = ""
          for j in range(columns):
              row += random.choice(char_list)
          print(row)
      

      【讨论】:

        【解决方案4】:

        random.choice() 与 str.join() 和列表推导一起使用:

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

        【讨论】:

        • 啊。 @Timur Shtatland 打字比我快。悲伤
        【解决方案5】:

        使用 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')
        

        【讨论】:

          【解决方案6】:

          您可以为每一行/列抽取随机索引,并用其中一个字符加载它们,其余的用其他字符加载。似乎您希望其中一半用 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)
          
          
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-23
            • 2021-05-07
            • 1970-01-01
            • 2018-12-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多