You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python DataFrame实现跨团队开发与测试人员随机配对

实现方案

原始DataFrame包含3个字段:name(人员姓名,格式为PersonX)、role(角色,分为Developer开发者、Tester测试人员)、team(所属团队)

实现思路

  • 先按角色拆分数据,分别将开发者和测试人员按所属团队分组存储,方便后续快速筛选跨团队候选
  • 配对时优先满足两个核心规则:配对双方不属于同一团队、连续配对序列中不出现同团队的同角色
  • 特殊情况处理:如果当前没有满足连续规则的候选,先放宽连续规则保证跨团队配对的核心要求
  • 大数据集适配:用分组存储的方式避免每次全量遍历候选,时间复杂度可控制在O(n)级别,支持万级以上数据量

代码实现

import pandas as pd
import random
from collections import defaultdict

def cross_team_pair(df: pd.DataFrame) -> dict:
    # 按团队分组存储开发者和测试
    dev_group = defaultdict(list)
    test_group = defaultdict(list)
    
    for _, row in df.iterrows():
        if row['role'] == 'Developer':
            dev_group[row['team']].append(row['name'])
        else:
            test_group[row['team']].append(row['name'])
    
    # 打平为带团队标签的列表并打乱
    all_dev = [(name, team) for team, names in dev_group.items() for name in names]
    all_test = [(name, team) for team, names in test_group.items() for name in names]
    random.shuffle(all_dev)
    random.shuffle(all_test)
    
    paired_result = {}
    used_test = set()
    last_dev_team = None
    last_test_team = None
    
    for dev_name, dev_team in all_dev:
        # 第一优先级:满足所有规则的候选
        candidates = []
        for test_name, test_team in all_test:
            if test_name not in used_test and test_team != dev_team and test_team != last_test_team and dev_team != last_dev_team:
                candidates.append((test_name, test_team))
        
        # 无符合连续规则的候选时,放宽连续限制,保留跨团队核心要求
        if not candidates:
            candidates = [
                (t_name, t_team) for t_name, t_team in all_test 
                if t_name not in used_test and t_team != dev_team
            ]
        
        # 随机选择配对
        select_test, select_test_team = random.choice(candidates)
        paired_result[dev_name] = select_test
        used_test.add(select_test)
        last_dev_team = dev_team
        last_test_team = select_test_team
    
    return paired_result

# 调用示例
if __name__ == "__main__":
    # 这里替换为你的实际DataFrame读取逻辑,比如pd.read_excel/ pd.read_csv
    df = pd.DataFrame([
        ["Person1", "Developer", "TeamA"],
        ["Person2", "Developer", "TeamB"],
        ["Person6", "Tester", "TeamB"],
        ["Person9", "Tester", "TeamA"]
    ], columns=["name", "role", "team"])
    
    result = cross_team_pair(df)
    # 按要求格式输出
    print("{")
    for i, (dev, test) in enumerate(result.items()):
        end_str = "," if i != len(result)-1 else ""
        print(f"    {dev}: {test}{end_str}")
    print("}")

扩展说明

  • 如果数据集规模达到10万条以上,可将全量候选遍历逻辑替换为按团队取数:提前维护每个测试团队的可用人员队列,需要选候选时直接排除开发所属团队和上一个测试团队,直接从剩余团队的队列里随机取数即可,无需遍历所有测试人员
  • 如果开发和测试人员数量不对等,可根据业务需求调整为支持一个开发配对多个测试,或剩余未配对人员单独输出的逻辑

内容的提问来源于stack exchange,提问作者Sri Chin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 13:36:04