2015-09-27 83 views
0

假設我在一個長列表中有一堆元素,並且我想根據在random.randit(lo,hi)函數中得到的輸出切換它們。 例如,我的名單是在Python中切換兩個元素

L=[(1,hi), (1, bye), (1,nope), (1,yup), (2,hi), (2, bye), (2,nope), (2,yup), (3,hi), (3, bye), (3,nope), (3,yup), (4,hi), (4, bye), (4,nope), (4,yup), (5,hi), (5, bye), (6,nope), (7,yup)] 

如果我輸入from random import randint然後做randint(0,(len(L)-1))我得到作爲輸出我想利用那個號碼索引的項目,並在列表中的最後一個元素交換它的數量,然後randint(lo, len(L)-2)),並從我的輸出中得到的數字,以該數字索引的元素並將其與倒數第二個元素交換,依此類推,直到我開始。這就像我想完全隨機地重新排列列表,而不是使用shuffle函數。我知道我可以做randint(0,(len(L)-1)),如果我得到5作爲輸出做A = L [19](因爲我知道我列表中的最後一個元素被索引爲19)。 然後做L [19] = L [5],讓第5個元素取第19個元素的位置,然後做L [5] = A,這樣最後一個元素成爲第5個元素。但我不知道如何將它寫成循環。

+0

洗牌隨機 – hjpotter92

+0

你做了什麼的 – Hooting

+0

可能重複[如何切換的Python列表兩個項目位置?(http://stackoverflow.com/questions/2493920/how-to-switch -position-of-two-items-in-a-python-list) –

回答

0
for i in xrange(len(L) - 1, 1, -1): 
    x = randint(lo, i) # lo would be 0 for shuffling entire list 
    L[i], L[x] = L[x], L[i] 
1
L =[(1,'hi'), (1, 'bye'), (1,'nope'), (1,'yup'), (2,'hi'), (2, 'bye'), (2,'nope'), (2,'yup'), (3,'hi'), (3, 'bye'), 
    (3,'nope'), (3,'yup'), (4,'hi'), (4, 'bye'), (4,'nope'), (4,'yup'), (5,'hi'), (5, 'bye'), (6,'nope'), (7,'yup')] 


    for i in range(-1, -len(L) -1 ,-1): 
    n = randint(0,(len(L) -1)) 
    L[n], L[i] = L[i], L[n] 


print(L) 

輸出

[(2, 'nope'), (6, 'nope'), (3, 'hi'), (3, 'yup'), (2, 'bye'), (7, 'yup'), (1, 'hi'), (3, 'bye'), (3, 'nope'), (1, 'yup'), (1, 'bye'), (5, 'bye'), (4, 'yup'), (5, 'hi'), (4, 'bye'), (2, 'hi'), (2, 'yup'), (4, 'hi'), (1, 'nope'), (4, 'nope')] 
0

您可以使用popappend包裹在一個列表解析結構重新洗牌的名單。然後,您隨機從縮小列表中彈出一個元素並追加到最後。

from random import randint 

L = [(1, 'hi'), (1, 'bye'), (1, 'nope'), (1, 'yup'), 
    (2, 'hi'), (2, 'bye'), (2, 'nope'), (2, 'yup'), 
    (3, 'hi'), (3, 'bye'), (3, 'nope'), (3, 'yup'), 
    (4, 'hi'), (4, 'bye'), (4, 'nope'), (4, 'yup'), 
    (5, 'hi'), (5, 'bye'), (6, 'nope'), (7, 'yup')] 

_ = [L.append(L.pop(randint(0, n))) for n in range(1, len(l) - 1)]