将python列表拆分为多个列表,分别无序排列每个列表

Break python list into multiple lists, shuffle each lists separately

本问题已经有最佳答案,请猛点这里访问。

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

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

我想把它们分成3组,并相应地对列表中的项目进行无序排列。

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

现在块将返回:

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

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

我希望最终输出看起来像:

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

或更好:

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

当然。random.shuffle工作到位,因此循环遍历列表元素并将其应用到它们上面就完成了第一项工作。对于"扁平化",我使用了我最喜欢的技巧:在子列表上应用sum,并将start元素作为空列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
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

一些结果:

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

(你说你想要一个像[[, , , , , ]]这样的列表,但我认为这是一个错误:我提供了一个简单、扁平的列表。