2015-10-31 34 views
1

我列出的這個列表的所有列表:洗牌共同的第二要素

[[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]] 

我想這在rearange使得公共第二要素(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」系列是隨機洗牌等

+0

定義你的意思是「洗牌」:爲什麼你的例子中的特定順序是正確的? –

+0

我試圖詳細說明這個問題。通過洗牌,我的意思是「隨機混合」 – Rodolphe

回答

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

只需通過簡單的第二個元素

def getkey(item): 
    return item[1] 

sorted(l,key=getkey) 
+0

我可能會理解你的回答錯誤,但是每次都會得到相同的結果。我需要列出在2D元素上排序的列表(就像它已經是這樣),但是,我希望隨機地重組每一個常見的2D元素。 – Rodolphe

+0

好吧,我明白了。如果你隨機化輸入列表(http://smallbusiness.chron.com/randomize-list-python-26724.html),然後按上述方式排序呢?另一種方法是創建一個列表清單(內部列表具有相同的第二個元素),並對每個內部列表進行隨機播放。 –

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

從這裏你可以與你的靜態值[1]號重新創建列表。