首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中混洗多维列表

如何在Python中混洗多维列表
EN

Stack Overflow用户
提问于 2014-12-07 07:32:08
回答 4查看 5.6K关注 0票数 3

我知道如何使用随机库shuffle(myList)中的shuffle函数对Python语言中的简单列表进行随机排列

但是,如何处理多维列表呢?

代码语言:javascript
复制
myList[][]

shuffle(myList)不起作用。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-07 07:43:41

您必须打乱顶级列表,然后才能将shuffle函数map到子列表中,如下所示

代码语言:javascript
复制
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

See python 2 fiddle

在python 3中就像这样

代码语言:javascript
复制
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)

see python 3 fiddle

票数 1
EN

Stack Overflow用户

发布于 2014-12-07 08:50:57

仅使用标准包,我能想到的最有效的方法是将数组分解为单个列表,随机排列,然后再次重塑为列表列表。

代码语言:javascript
复制
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):

代码语言:javascript
复制
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,它们的使用是不可知的。

票数 1
EN

Stack Overflow用户

发布于 2018-03-29 02:44:09

首先,导入numpy模块:

代码语言:javascript
复制
import numpy as np

numpy有一个名为random.shuffle()的方法。这个方法可以让你洗牌一个多维的列表。

要使用此方法混洗列表,需要将列表转换为ndarray类,然后将其传递给random.shuffle()

代码语言:javascript
复制
>>> 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]])

现在,重新洗牌。

代码语言:javascript
复制
foo = np.random.shuffle(foo)

foo的值如下所示:

代码语言:javascript
复制
array([[1, 2, 3],
       [7, 8, 9],
       [4, 5, 6]])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27337784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档