2017-12-02 144 views
1

我需要從一個dicitonary如何交換字典中的兩個隨機值?

def alphabetcreator(): 
     letters = random.sample(range(97,123), 26) 
     newalpha = [] 
     engalpha =['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] 
     alphasmerged = {} 
     for i in letters: 
      newalpha.append(chr(i)) 
     alphasmerged = dict(zip(engalpha, newalpha)) 
     return(alphabetsmerged) 

此代碼給我,我的兩個不同的字母交換兩個隨機值,將它們放入一個字典,所以我可以一個與其它之間的轉換。我現在需要隨機交換兩個值,同時保持所有其他值相同。我怎樣才能做到這一點?

+2

你所說的「交換」是什麼意思?反向鍵值或定位在原始列表中? – Ajax1234

+1

1)您不需要return語句中的括號2)您的預期輸出是什麼? – darthbith

+0

@ Ajax1234我的意思是定位在原始列表中。例如,我的第一本字典可能是{'a':'h','b':'d','c':'y'}然後我需要它,以便隨機選擇交換這些圓形{ 'a':'d','b':h,'c':'y'}作爲示例 – Sh1elds

回答

2

您可以先使用random.sample從集合中隨機選取兩個不同的值。 來自文檔:

返回從總體序列或集合中選擇的唯一元素的k長度列表。用於無需更換的隨機抽樣。

在字典的鍵上使用此功能可以使用兩個不同的鍵。 在Python 3中,您可以直接在dict_keys對象上使用它。 在Python 2中,您可以將d.keys()轉換爲list,或直接將字典傳遞給sample

>>> import random 
>>> d = {'a': 1, 'b': 2} 
>>> k1, k2 = random.sample(d.keys(), 2)   # Python 3 
>>> k1, k2 = random.sample(d, 2)     # Python 2 
>>> k1, k2 
['a', 'b'] 

然後,您可以就地交換集合的兩個值。

>>> d[k1], d[k2] = d[k2], d[k1] 
>>> d 
{'b': 1, 'a': 2} 
+1

我得到'random.sample'需要'k'的錯誤。 –

+0

@JoeIddon我的錯誤,我犯了一個錯字。 –

0

你可以試試這個:

import random 
engalpha =['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] 
new_dict = {a:b for a, b in zip(engalpha, map(chr, random.sample(range(97,123), 26)))} 
key_val = random.choice(list(new_dict.keys())) 
final_dict = {b if a == key_val else a:a if a == key_val else b for a, b in new_dict.items()} 

關於你最近的評論:

import random 
s = {'a': 'h', 'b': 'd', 'c': 'y'} 
random_dict = [(a, b) for a, b in random.sample(list(s.items()), 2)] 
new_dict = {a:b for a, b in zip([i[0] for i in sorted(random_dict, key=lambda x:x[0])], [i[-1] for i in sorted(random_dict, key=lambda x:x[-1])][::-1])} 
final_dict = {a:new_dict.get(a, b) for a, b in s.items()} 

輸出(隨機生成):

{'a': 'y', 'c': 'h', 'b': 'd'} 
0
d = {12: 34, 67: 89} 
k, v = random.choice(list(d.items())) 
d[v] = k 
d.pop(k) 

它運行的時候,給了d爲隨機輸出:

{12: 34, 89: 67} 
+0

這將交換一個關鍵字的價值,這不是OP想要的。 OP想要交換兩個值。 – C8H10N4O2