有没有一种方法可以在Python字典中随机洗牌键和值,但结果可能是';没有任何原始键值对吗?

有没有一种方法可以在Python字典中随机洗牌键和值,但结果可能是';没有任何原始键值对吗?,python,Python,我想洗牌这个字典中的键值对,这样结果就没有原始的键值对了。起始字典: my_dict = {'A':'a', 'K':'k', 'P':'p', 'Z':'z'} 意外结果示例: my_dict_shuffled = {'Z':'a', 'K':'k', <-- Original key value pair 'A':'p',

我想洗牌这个字典中的键值对,这样结果就没有原始的键值对了。起始字典:

my_dict = {'A':'a',
           'K':'k',
           'P':'p',
           'Z':'z'}
意外结果示例:

my_dict_shuffled = {'Z':'a',
                    'K':'k', <-- Original key value pair
                    'A':'p',
                    'P':'z'}
my_dict_shuffled = {'Z':'a',
                    'A':'k',
                    'K':'p',
                    'P':'z'}

我尝试了while循环和for循环,但没有成功。请帮忙!提前感谢。

一个不在同一位置留下任何元素的洗牌称为A。从本质上讲,这个问题有两个部分:首先生成混乱的密钥,然后构建新的字典

我们可以通过洗牌随机产生一个混乱,直到我们得到一个;平均来说,即使是大型词典,它也只需要2-3次尝试,但这是一个小问题,因为它运行的时间很可能比预期的要长。好处是,这微不足道地保证了所有的精神错乱都是同样可能的

来自随机导入洗牌
def混乱(钥匙):
如果len(键)==1:
raise VALUE ERROR('不可能出现混乱')
新密钥=列表(密钥)
而any(x==y表示x,zip中的y(键,新的_键)):
洗牌(新的_键)
返回新的\u密钥
def随机命令(d):
返回{x:d[y]for x,y在zip中(d,disrangement(d))}
用法:

洗牌命令({'a':1,'b':2,'c':3}) {'a':2,'b':3,'c':1}
这是我从a中学到的一个傻瓜式算法:)

导入itertools
随机输入
我的字典={'A':'A',
“K”:“K”,
‘P’:‘P’,
'Z':'Z'}
#洗牌键和值。
my_dict_items=列表(my_dict.items())
随机。洗牌(我的目录项)
随机键,随机值=zip(*my_dict_items)
#将无序排列的值偏移1。
无序_值=itertools.cycle(无序_值)
下一步(无序_值,无)#将值偏移1。
#保证每个值与随机不同的键配对!
my_random_dict=dict(zip(混洗的_键、混洗的_值))
免责声明(感谢您提及,@jf328):这不会产生所有可能的排列!它只会生成正好有一个“循环”的置换。简单地说,该算法永远不会给出以下结果:

{'A':'k',
‘K’:‘a’,
‘P’:‘z’,
'Z':'p'}
但是,我认为您可以通过构建子周期的随机列表来扩展此解决方案:

(2, 2, 3) => concat(zip(*items[0:2]), zip(*items[2:4]), zip(*items[4:7]))

新的工作守则,如果你没有正确的答案,你能用第二个用例更新你的问题吗

my_dict = {'A':'a',
           'K':'k',
           'P':'p',
           'Z':'z'}

while True:
   new_dict = dict(zip(list(my_dict.keys()), random.sample(list(my_dict.values()),len(my_dict))))
   if new_dict.items() & my_dict.items():
      continue
   else:
      break

print(my_dict)
print(new_dict)

也许有一种优雅的方式,但你试过暴力手段吗?另外,不是您要寻找的,而是一种非随机的方法,就是相对于键移动所有值。顺便说一句,欢迎使用堆栈溢出!检查一下。你能发布你的尝试吗?你可以回答这个问题。洗牌一次。将阵列拆分为好集和坏集(未更改)。对于坏集合中的每一个元素,在好集合中随机选取一个并交换它们。@jf328是否有办法确保从好集合中选取的元素与在坏集合中替换的元素不相同?可能重复:次要问题是它只生成循环,而不是完全随机。但在大多数情况下应该没问题。这是我的圣诞秘密。除了
shuffed_values
中的打字错误外,还有一个问题,因为您使用的是
zip
,只有一个参数-这会导致“太多值无法解包”错误。对不起,卡娅,我是想解决新的密码问题,我更新了我的答案。我喜欢你的回答