2011-10-16 63 views

回答

18

A dict是一組無序的鍵值對。當你迭代一個dict時,它是有效的隨機的。但要明確地隨機化鍵值對序列,您需要使用排序的不同對象,如列表。 dict.items()dict.keys()dict.values()每個返回列表,可以混洗。

items=d.items() # List of tuples 
random.shuffle(items) 
for key, value in items: 
    print key, value 

keys=d.keys() # List of keys 
random.shuffle(keys) 
for key in keys: 
    print key, d[key] 

或者,如果你不關心鍵:

values=d.values() # List of values 
random.shuffle(values) # Shuffles in-place 
for value in values: 
    print value 

您也可以在 「排序隨機」:

for key, value in sorted(d.items(), key=lambda x: random.random()): 
    print key, value 
+8

在Python3中,'d.items()','d.keys()'和'd.values()'產生一個迭代器對象。您需要使用'list()'函數將該迭代器顯式轉換爲列表。 –

+0

「當你迭代一個'dict'時,它實際上是隨機的」 - 事實並非如此。考慮到像int這樣的事情很可能以排序的順序出現,依賴它甚至看起來是隨意的。另外,隨機密鑰的排序是O(nlog(n))而不是O(n),所以應該避免它。 – user2357112

+0

你會如何適應這個總是隨機洗牌字典(以同樣的方式保持右鍵與正確值之間的鏈接,例如使用'np.random.RandomState(100)'? –

7

你不能。通過.keys()獲取密鑰列表,對它們進行隨機掃描,然後在索引原始字典的同時遍歷列表。

或使用.items(),然後洗牌並迭代。

+0

或'dict.values()'如果你想要的是價值觀。 –

0

正如Charles Brunet已經說過詞典是關鍵值對的隨機排列。但爲了讓它變得隨機,你將使用隨機模塊。 我已經編寫了一個函數,它將洗牌所有的密鑰,所以當你迭代它時,你將會隨機迭代。您可以通過查看代碼更清楚地瞭解:

def shuffle(q): 
    """ 
    This function is for shuffling 
    the dictionary elements. 
    """ 
    selected_keys = [] 
    i = 0 
    while i < len(q): 
     current_selection = random.choice(q.keys()) 
     if current_selection not in selected_keys: 
      selected_keys.append(current_selection) 
      i = i+1 
    return selected_keys 

現在,當你調用該函數只是傳遞參數(要洗牌字典的名稱),你會得到哪些洗牌鍵的列表。最後,您可以爲列表的長度創建一個循環,並使用name_of_dictionary[key]來獲取該值。 希望這將值添加到這個堆棧:)

Source: Radius Of Circle