生成随机列表列表

时间:2016-09-15 13:00:21

标签: python

我是Python的新手,所以我可能会做基本的错误,所以请先道歉。

以下是我试图获得的结果:

foo = [
    ["B","C","E","A","D"],
    ["E","B","A","C","D"],
    ["D","B","A","E","C"],
    ["C","D","E","B","A"]
]

基本上,一组随机排列的字母列表没有重复。

以下是迄今为止我能得到的结果:

foo = ['BDCEA', 'BDCEA', 'BDCEA', 'BDCEA']

主要问题是每次都是相同的排列。到目前为止,这是我的代码:

import random
import numpy as np
letters = ["A", "B", "C", "D", "E"]
nblines = 4
foo = np.repeat(''.join(random.sample(letters, len(letters))), nblines)  

帮助表示感谢。感谢

3 个答案:

答案 0 :(得分:2)

代码的问题在于

foo = np.repeat(''.join(random.sample(letters, len(letters))), nblines)  

将首先创建一个随机排列,然后重复相同的排列nblines次。 Numpy.repeat不会重复调用函数,它会重复使用random.sample创建的已存在数组的元素。

另一件事是numpy设计用于处理数字,而不是字符串。这是一个简短的代码片段(不使用numpy)来获得您想要的结果:

[random.sample(letters,len(letters)) for i in range(nblines)]

结果:类似于:

foo = [
    ["B","C","E","A","D"],
    ["E","B","A","C","D"],
    ["D","B","A","E","C"],
    ["C","D","E","B","A"]
]

我希望这有帮助;)

PS:我看到其他人在我写这篇文章时给出了类似的答案。

答案 1 :(得分:1)

np.repeat重复相同的数组。如果您将其更改为:

,您的方法将起作用
[''.join(random.sample(letters, len(letters))) for _ in range(nblines)]
Out: ['EBCAD', 'BCEAD', 'EBDCA', 'DBACE']

这是写这个的简短方法:

foo = []
for _ in range(nblines):
    foo.append(''.join(random.sample(letters, len(letters))))

foo
Out: ['DBACE', 'CBAED', 'ACDEB', 'ADBCE']    

答案 2 :(得分:1)

这是一个普通的Python解决方案,使用"传统" style for循环。

from random import shuffle

nblines = 4
letters = list("ABCDE")
foo = []
for _ in range(nblines):
    shuffle(letters)
    foo.append(letters[:])

print(foo)

典型输出

[['E', 'C', 'D', 'A', 'B'], ['A', 'B', 'D', 'C', 'E'], ['A', 'C', 'B', 'E', 'D'], ['C', 'A', 'E', 'B', 'D']]

random.shuffle函数就地清单列表。我们使用foo将列表的副本附加到letters[:],否则foo最终将包含对一个列表对象的4个引用。

这是一个稍高级的版本,使用生成器函数来处理混洗。每次我们调用next(sh)时,它都会对存储在生成器中的lst列表进行洗牌,并返回它的副本。因此,我们可以在列表推导中调用next(sh)来构建列表,这比使用传统的for循环要小一些。此外,列表补偿可能比在传统.append循环中使用for稍快一些。

from random import shuffle

def shuffler(seq):
    lst = list(seq)
    while True:
        shuffle(lst)
        yield lst[:]

sh = shuffler('ABCDE')
foo = [next(sh) for _ in range(10)]

for row in foo:
    print(row)

典型输出

['C', 'B', 'A', 'E', 'D']
['C', 'A', 'E', 'B', 'D']
['D', 'B', 'C', 'A', 'E']
['E', 'D', 'A', 'B', 'C']
['B', 'A', 'E', 'C', 'D']
['B', 'D', 'C', 'E', 'A']
['A', 'B', 'C', 'E', 'D']
['D', 'C', 'A', 'B', 'E']
['D', 'C', 'B', 'E', 'A']
['E', 'D', 'A', 'C', 'B']