如何交换字典中的两个随机值?

问题描述:

我需要从一个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

您可以先使用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我的错误,我犯了一个错字。 –

你可以试试这个:

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'} 

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