洗牌所有常见的第二个元素列表

时间:2015-10-31 19:18:16

标签: python shuffle

我有这个列表清单:

[[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”系列的四个随机洗牌等等。

3 个答案:

答案 0 :(得分:3)

您可以使用itertools.groupbyrandom.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]]

答案 1 :(得分:2)

from random import shuffle
a = [ key[0] for key in lists]
shuffle(a)

从这里,您可以使用静态值[1]数字重新创建列表。

答案 2 :(得分:1)

只需简单地排序第二个元素

def getkey(item):
    return item[1]

sorted(l,key=getkey)