Python如何限制字典集合值长度 超长时随机弹出元素至长度3
Python字典集合值长度统一截断实现
问题说明
现有字典real_vertrices_copy所有值均为集合类型,定义如下:
real_vertrices_copy = { 'key': {1,3,8,4,2}, 'key1': {9,4,2,4}, 'key2': {6,4,2}, 'key3': {9,3,5,3,5} }
需求为将所有值的长度统一限制为3:若集合长度大于3,则随机移除元素,直到长度等于3。
此前尝试的实现代码存在逻辑错误,无法达成效果:
for x in real_vertrices_copy.values(): if len(x) > 20: real_vertrices_copy.popitem()
错误点:
- 长度阈值设置为20,和要求的上限3不符
- 调用
dict.popitem()是删除字典本身的键值对,没有对作为值的集合做任何修改 - 遍历字典值的过程中直接删除字典键值对,存在触发遍历异常的风险
实现代码
集合本身支持元素删除操作,直接遍历字典值,对长度超标的集合循环随机移除元素即可:
import random for s in real_vertrices_copy.values(): while len(s) > 3: # 随机选取集合内元素移除,保证随机性不受Python版本set实现影响 s.remove(random.choice(list(s)))
实现说明
- 长度小于等于3的集合不会做任何修改,符合预期
- 如果不需要严格保证跨版本的随机均匀性,可以直接用集合原生
pop()方法替换循环内逻辑,代码更简洁:s.pop(),注意部分Python版本下set的pop顺序不是严格随机,会按内部哈希顺序移除元素 - 处理完成后所有集合值长度均为3,因为是随机移除,每次运行的保留元素结果会有差异,参考输出如下:
{ 'key': {2, 4, 8}, 'key1': {2, 4, 9}, 'key2': {2, 4, 6}, 'key3': {3, 5, 9} }
内容的提问来源于stack exchange,提问作者Melany
相关产品推荐
相关产品推荐

