如何在Python中从指定列表生成无重复的随机字符串取值列表?
Python 从自定义列表生成无重复随机字符串取值方案
问题原因
你现有代码和之前的尝试出现重复值有两个核心原因:
- 你用
random.choice()循环取值的逻辑本身没有去重机制,多次取值天然可能返回重复内容 - 你的原始列表
column_arr本身包含大量重复元素,哪怕用random.sample(),如果不先对原列表做值去重,也只会保证取的元素索引不重复,依旧可能抽到值相同的元素
解决方案
先对原始列表做值去重,再通过random.sample()直接取指定数量的随机值,就能保证返回结果完全无重复。
保留原列表元素出现顺序的实现代码
import random column_arr = ['id', 'name', 'location', 'duration' , 'id', 'name', 'quantity', 'unit' , 'id', 'description', 'unit', 'quantity', 'unit_cost'] # 对原列表去重,保留元素首次出现的顺序(Python3.7及以上版本支持) unique_column = list(dict.fromkeys(column_arr)) # 从去重后的列表中随机取3个不重复的值 arr = random.sample(unique_column, 3) print(arr)
无需保留顺序的简化实现
如果不需要保留原列表的元素出现顺序,可以直接用集合去重,代码更简洁:
import random column_arr = ['id', 'name', 'location', 'duration' , 'id', 'name', 'quantity', 'unit' , 'id', 'description', 'unit', 'quantity', 'unit_cost'] unique_column = list(set(column_arr)) arr = random.sample(unique_column, 3) print(arr)
注意事项
random.sample()的取样数量不能大于待取样列表的总长度,你当前场景下去重后的列表共有8个唯一元素,取3个完全符合要求- 不要使用循环+
random.choice()的方案实现无重复取值,该逻辑本身无法避免重复,需要额外加判断去重,效率远低于上述方案
内容的提问来源于stack exchange,提问作者Jore Dawal
相关产品推荐
相关产品推荐

