我是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)
帮助表示感谢。感谢
答案 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']