Python实现按公司轮询分组人员JSON数据
Python实现按公司轮询分组功能
需求说明
给定人员数据列表,需按照公司轮询规则完成分组:
- 每个分组中,同一公司最多仅能包含1名未完成分组的人员
- 持续轮询选取人员,直到所有人员均完成分组
- 最终输出以
group1、group2...为键的分组字典
实现代码
from collections import defaultdict import json def group_by_company_round_robin(people): # 按公司归类人员,并将每个公司的人员列表转为迭代器 company_groups = defaultdict(list) for person in people: company_groups[person["company"]].append(person) company_iterators = {comp: iter(members) for comp, members in company_groups.items()} groups = {} group_count = 1 while company_iterators: current_group = [] # 遍历当前仍有剩余人员的公司(转成list避免迭代时修改字典) for comp in list(company_iterators.keys()): try: # 取出该公司下一名人员 current_group.append(next(company_iterators[comp])) except StopIteration: # 该公司人员已全部分配,移除迭代器 del company_iterators[comp] if current_group: groups[f"group{group_count}"] = current_group group_count += 1 return groups # 示例数据 sample_data = [ {"id": 1, "first_name": "John", "last_name": "Doe", "company": "ABC Corporation", "email": "john.doe@example.com"}, {"id": 2, "first_name": "Jane", "last_name": "Smith", "company": "ABC Corporation", "email": "jane.smith@example.com"}, {"id": 3, "first_name": "Michael", "last_name": "Johnson", "company": "ABC Corporation", "email": "michael.johnson@example.com"}, {"id": 4, "first_name": "Emily", "last_name": "Brown", "company": "BestCo", "email": "emily.brown@example.com"}, {"id": 5, "first_name": "David", "last_name": "Lee", "company": "BestCo", "email": "david.lee@example.com"}, {"id": 6, "first_name": "Sophia", "last_name": "Wang", "company": "Innovate Solutions", "email": "sophia.wang@example.com"} ] # 执行并输出结果 output = group_by_company_round_robin(sample_data) print(json.dumps(output, indent=2))
代码说明
- 分组与迭代器转换:先将人员按公司归类,再把每个公司的人员列表转为迭代器,无需手动管理索引即可逐个取出人员。
- 轮询分组逻辑:循环遍历所有仍有剩余人员的公司,每轮从每个公司取1人组成分组;若某公司人员已全部分配,则移除该公司的迭代器,不再参与后续轮询。
- 结果构建:每轮生成的分组以
groupN为键存入结果字典,直到所有人员完成分组。
内容的提问来源于stack exchange,提问作者Russell
相关产品推荐
相关产品推荐

