Skip to main content
 首页 » 编程设计

python之洗牌一个共同的第二个元素的所有列表

2025年05月04日15wayfarer

我有这个列表列表:

[[1, 0.007], [2, 0.007], [3, 0.007], [4, 0.007], [5, 0.01], [6, 0.01], [7, 0.01], [8, 0.01], [9, 0.02], [10, 0.02], [11, 0.02], [12, 0.02], [13, 0.13], [14, 0.13], [15, 0.13], [16, 0.13], [17, 0.28], [18, 0.28], [19, 0.28], [20, 0.28], [21, 4.0], [22, 4.0], [23, 4.0], [24, 4.0]] 

我想重新排列,以便随机排列所有常见第二元素(0.007、0.01、0.02、0.13、.28、4)的列表。

例如:

[[3, 0.007], [1, 0.007], [4, 0.007], [2, 0.007], [7, 0.01], [6, 0.01], [5, 0.01], etc. 

前四个列表 (1,2,3,4) 都属于一个“0.007”系列,随机打乱在一起;接下来的四个,都属于“0.01”系列,随机打乱等等。

请您参考如下方法:

您可以使用 itertools.groupby 和 random.shuffle 来重建随机列表列表,如下所示:

In [23]: mix = [[1, 0.007], [2, 0.007], [3, 0.007], [4, 0.007], [5, 0.01], [6, 0.01], [7, 0.01], [8, 0.01], [9, 0.02], [10, 0.02], [11, 0.02], [12, 0.02], [13, 0.13], [14, 0.13], [15, 0.13], [16, 0.13], [17, 0.28], [18, 0.28], [19, 0.28], [20, 0.28], [21, 4.0], [22, 4.0], [23, 4.0], [24, 4.0]] 
 
In [24]: from itertools import groupby 
 
In [25]: import random 
 
In [26]: groups = [] 
 
# grouping each list by 2nd item 
In [27]: for _, g in groupby(mix, lambda x: x[1]): 
   ....:     group = list(g) 
   ....:     random.shuffle(group)  # then shuffle each list in place 
   ....:     groups.extends(group) 
 
In [28]: groups 
Out[28]:  
[[2, 0.007], [4, 0.007], [3, 0.007], [1, 0.007], 
 [8, 0.01], [5, 0.01], [7, 0.01], [6, 0.01], 
 [11, 0.02], [9, 0.02], [10, 0.02], [12, 0.02], 
 [15, 0.13], [13, 0.13], [14, 0.13], [16, 0.13], 
 [20, 0.28], [19, 0.28], [17, 0.28], [18, 0.28], 
 [21, 4.0], [22, 4.0], [24, 4.0], [23, 4.0]]