将 python 个列表分成多个列表,分别打乱每个列表

Break python list into multiple lists, shuffle each lists separately

假设我的帖子已按日期排序。

[<Post: 6>, <Post: 5>, <Post: 4>, <Post: 3>, <Post: 2>, <Post: 1>]

我想将它们分成 3 组,并相应地打乱列表中的项目。

chunks = [posts[x:x+2] for x in xrange(0, len(posts), 2)]

现在 Chunks 将 return:

[[<Post: 6>, <Post: 5>], [<Post: 4>, <Post: 3>], [<Post: 2>, <Post: 1>]]

有哪些有效的方法可以在每个列表中随机排列这些项目? 我可以考虑遍历它们,分别创建每个列表,但这似乎是重复的...

我希望最终输出类似于:

[[<Post: 5>, <Post: 6>], [<Post: 4>, <Post: 3>], [<Post: 1>, <Post: 2>]]

或更好:

[<Post: 5>, <Post: 6>, <Post: 4>, <Post: 3>, <Post: 1>, <Post: 2>]

当然可以。 random.shuffle 就地工作,因此循环遍历列表元素并将其应用于它们是第一项工作。 对于 "flattening",我使用了我最喜欢的技巧:在起始元素为空列表的子列表上应用 sum

import random,itertools

chunks = [["Post: 6", "Post: 5"], ["Post: 4", "Post: 3"], ["Post: 2", "Post: 1"]]

# shuffle

for c in chunks: random.shuffle(c)

# there you already have your list of lists with shuffled sub-lists
# now the flattening

print(sum(chunks,[]))                  # or (more complex but faster below)
print(list(itertools.chain(*chunks)))  # faster than sum on big lists

一些结果:

['Post: 5', 'Post: 6', 'Post: 4', 'Post: 3', 'Post: 2', 'Post: 1']
['Post: 6', 'Post: 5', 'Post: 3', 'Post: 4', 'Post: 1', 'Post: 2']

(你说你想要类似 [[<Post: 5>, <Post: 6>, <Post: 4>, <Post: 3>, <Post: 1>, <Post: 2>]] 的东西(列表中的列表)但我想这是一个错字:我提供了一个简单的扁平化列表。