如何用字典列表中的随机元素替换列表中重复出现的元素?
问题描述
给定一个包含重复元素的列表:
my_list = ['a', 'b', 'c', 'd', 'b', 'a', 'c', 'a']
以及一个映射字典,每个键对应一组可选值:
my_dict = {'a':[1, 2], 'b':[3, 4], 'c':[5, 6], 'd':[7, 8]}
需要实现两个需求:
- 依据列表元素(作为字典键),从对应值列表中随机选取一个值
- 列表中每出现一次该键,都重新执行随机取值操作
尝试使用Pandas实现时,编写了以下代码:
import pandas as pd import random df = pd.DataFrame(my_list, index=[0,1,2,3,4,5,6,7], columns=['Letters']) df['Random_Values'] = df['Letters'].map({k:random.choice(v) for k,v in my_dict.items()})
但输出结果中,同一个键的所有实例都复用了同一个随机值(比如所有'a'要么全是1要么全是2),无法满足每次出现都重新随机的要求。需要修改代码,同时接受纯Python列表的实现方案。
解决方案
一、Pandas 修改方案
原代码的问题在于:字典推导式{k:random.choice(v) for k,v in my_dict.items()}仅在map()执行前运行一次,每个键提前固定了唯一的随机值,后续所有该键的元素都会复用这个值。
改用apply()方法,对每一行的元素单独调用随机选择逻辑:
import pandas as pd import random my_list = ['a', 'b', 'c', 'd', 'b', 'a', 'c', 'a'] my_dict = {'a':[1, 2], 'b':[3, 4], 'c':[5, 6], 'd':[7, 8]} df = pd.DataFrame(my_list, columns=['Letters']) df['Random_Values'] = df['Letters'].apply(lambda x: random.choice(my_dict[x]))
执行后,同一个键的不同实例会得到不同的随机值,示例输出:
Letters Random_Values 0 a 2 1 b 4 2 c 5 3 d 8 4 b 3 5 a 1 6 c 6 7 a 2
二、纯Python列表实现方案
直接遍历原列表,对每个元素单独执行随机取值操作,生成结果列表:
import random my_list = ['a', 'b', 'c', 'd', 'b', 'a', 'c', 'a'] my_dict = {'a':[1, 2], 'b':[3, 4], 'c':[5, 6], 'd':[7, 8]} random_values = [random.choice(my_dict[item]) for item in my_list]
生成的random_values列表会对应原列表每个元素的随机取值,示例结果:[1, 3, 6, 7, 4, 2, 5, 1],完全满足每次出现都重新随机的需求。
内容的提问来源于stack exchange,提问作者TrevorM
相关产品推荐
相关产品推荐

