Python如何打乱字典中键对应的值并重新生成新字典
问题原因
你的整体思路是正确的,报错'dict_values' object is not subscriptable的原因是:Python 3 中dict.keys()、dict.values()返回的是字典视图对象,这种对象会和原字典动态关联,没有实现可变序列的下标修改接口,而random.shuffle要求传入的参数是支持原地修改的可变序列(比如列表),所以直接传入视图对象就会报错。
实现方法
只需要先把键和值都转成列表,打乱值列表后再和键配对生成新字典即可:
import random GiftDict = {'Seth':'A', 'Jeremy':'B', 'Ben':'C'} # 将键、值视图转成列表 person_list = list(GiftDict.keys()) value_list = list(GiftDict.values()) # 打乱值列表 random.shuffle(value_list) # 配对生成新字典 new_gift_dict = dict(zip(person_list, value_list)) print(new_gift_dict) # 运行示例输出:{'Seth': 'C', 'Jeremy': 'A', 'Ben': 'B'}
拓展场景(可选)
如果你需要实现错位排列,也就是保证每个key对应的value和原字典完全不同(比如互送礼物不能抽到自己的礼品),可以加一层校验逻辑:
import random GiftDict = {'Seth':'A', 'Jeremy':'B', 'Ben':'C'} person_list = list(GiftDict.keys()) value_list = list(GiftDict.values()) # 循环打乱直到所有值都和原对应关系不重合 while True: random.shuffle(value_list) if all(value_list[i] != GiftDict[person_list[i]] for i in range(len(person_list))): break new_gift_dict = dict(zip(person_list, value_list))
内容的提问来源于stack exchange,提问作者Bojan Milinic
相关产品推荐
相关产品推荐

