我知道如何使用随机库shuffle(myList)
中的shuffle函数对Python语言中的简单列表进行随机排列
但是,如何处理多维列表呢?
myList[][]
shuffle(myList)不起作用。
发布于 2014-12-07 07:43:41
您必须打乱顶级列表,然后才能将shuffle
函数map
到子列表中,如下所示
from random import shuffle
foo = []
foo.append([1, 2, 3])
foo.append([4, 5, 6])
foo.append([7, 8, 9])
shuffle(foo)
map(shuffle, foo)
print foo
在python 3中就像这样
from random import shuffle
foo = []
foo.append([1, 2, 3])
foo.append([4, 5, 6])
foo.append([7, 8, 9])
shuffle(foo)
for ii, sublist in enumerate(foo):
shuffle(foo[ii])
print(foo)
发布于 2014-12-07 08:50:57
仅使用标准包,我能想到的最有效的方法是将数组分解为单个列表,随机排列,然后再次重塑为列表列表。
import random
def shuffle2d(arr2d, rand=random):
"""Shuffes entries of 2-d array arr2d, preserving shape."""
reshape = []
data = []
iend = 0
for row in arr2d:
data.extend(row)
istart, iend = iend, iend+len(row)
reshape.append((istart, iend))
rand.shuffle(data)
return [data[istart:iend] for (istart,iend) in reshape]
def show(arr2d):
"""Shows rows of matrix (of strings) as space-separated rows."""
print ("\n".join(" ".join(row) for row in arr2d))
# Generate some ragged data (5 rows):
arr2d = []
for i,a in enumerate("ABCDE"):
n = random.randint(3,7)
arr2d.append([a+str(j) for j in range(1,n+1)])
# display original and shuffled data
print ("Original...")
show(arr2d)
print ("Shuffled...")
show(shuffle2d(arr2d))
print ("Again...")
show(shuffle2d(arr2d))
示例输出(Python 2.7):
Original...
A1 A2 A3
B1 B2 B3 B4 B5
C1 C2 C3
D1 D2 D3
E1 E2 E3 E4 E5
Shuffled...
A3 C1 E5
C3 D3 A2 E1 D1
A1 E2 C2
B5 B4 B2
B1 D2 E4 E3 B3
Again...
B2 C2 C3
B1 D2 E5 A3 D1
A1 E3 A2
B5 D3 C1
B4 E4 E1 B3 E2
顺便说一句,上面的代码在Python3.4上同样有效。唯一依赖于版本的代码特性是print和range,它们的使用是不可知的。
发布于 2018-03-29 02:44:09
首先,导入numpy
模块:
import numpy as np
numpy
有一个名为random.shuffle()
的方法。这个方法可以让你洗牌一个多维的列表。
要使用此方法混洗列表,需要将列表转换为ndarray
类,然后将其传递给random.shuffle()
。
>>> foo = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> foo = np.array(foo)
>>> foo
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
现在,重新洗牌。
foo = np.random.shuffle(foo)
foo
的值如下所示:
array([[1, 2, 3],
[7, 8, 9],
[4, 5, 6]])
https://stackoverflow.com/questions/27337784
复制相似问题