Python技术迷

大厂hr发声:35+老员工比985,211更值钱

刚刷到一个贴子,说某大厂HR私下承认:35+员工其实比985/211的年轻人更值钱。原因是经验丰富,少走弯路,项目全局观更强。

Image

作为程序员,我觉得这话挺真实的。写代码不是拼谁熬夜久,而是看谁能少踩坑。一个bug,如果新人改可能要三天,老员工凭经验半天就搞定,效率差距就是钱啊。网友有人说学历才是硬通货,但在职场里,学历只能帮你进门,能不能站稳脚跟看的是长期积累的“debug经验”。

当然,也不能说年轻人没价值。年轻人敢试敢拼,有时候能提出新思路。但关键岗位还是要靠老员工压阵,就像打游戏,菜鸟能冲锋,老玩家才是能带飞的。

年龄不是负担,真正的核心还是“能创造价值”。所以啊,别光看35+,更要看能不能在团队里持续发光发热。【备注:文末可领最新资料】

面试题:平均工资:部门与公司比较

=昨晚十一点多,我在公司楼下买酸奶,手机里我们组小李突然问:哥,部门平均工资跟公司平均怎么比,代码应该咋写?我想了想,别整花活,就把数据清清楚楚地“分两遍走”,一次算平均,一次拿来比较,够用了。

我们有一堆员工记录:(emp_id, dept, salary)。要做三件事: 1)算出每个部门的平均工资; 2)算出公司整体的平均工资; 3)把两个平均数一比较,看看哪个部门高于公司平均;再顺手标记每个员工是否高于自己部门平均。 注意点就两个:部门可能没人(或被过滤掉)别除以 0,工资可能是小数,保留精度别乱来。

朴素但稳的做法(两趟聚合)

第一趟把每个部门的总和与人数,还有全公司的总和与人数,先堆起来;第二趟拿到平均值后再去做比较和标记。时间复杂度 O(n),空间 O(k)(k 是部门数),挺划算。

from collections import defaultdict
from typing import List, Tuple, Dict, Any

Record = Tuple[int, str, float]  # (emp_id, dept, salary)

defdept_vs_company(records: List[Record], ndigits: int = 2) -> Dict[str, Any]:
# 一趟聚合
    dept_sum = defaultdict(float)
    dept_cnt = defaultdict(int)
    total_sum = 0.0
    total_cnt = 0

for _, dept, sal in records:
# 容错:跳过非法工资或空部门
if dept isNoneor sal isNone:
continue
        dept_sum[dept] += float(sal)
        dept_cnt[dept] += 1
        total_sum += float(sal)
        total_cnt += 1

# 计算平均
    dept_avg = {}
for d in dept_sum:
if dept_cnt[d] > 0:
            dept_avg[d] = round(dept_sum[d] / dept_cnt[d], ndigits)

    company_avg = round(total_sum / total_cnt, ndigits) if total_cnt > 0else0.0

# 部门相对公司:>、=、<
    dept_vs = {}
for d, avg in dept_avg.items():
        dept_vs[d] = "higher"if avg > company_avg else ("lower"if avg < company_avg else"equal")

# 标记员工是否高于本部门平均
    employee_flags = []
for emp_id, dept, sal in records:
if dept in dept_avg and sal isnotNone:
            employee_flags.append({
"emp_id": emp_id,
"dept": dept,
"salary": round(float(sal), ndigits),
"above_dept_avg": float(sal) > dept_avg[dept]
            })

return {
"company_avg": company_avg,
"dept_avg": dept_avg,
"dept_vs_company": dept_vs,
"employees": employee_flags
    }

# 小例子
if __name__ == "__main__":
    data = [
        (101, "R&D", 23_000),
        (102, "R&D", 27_500),
        (201, "Sales", 18_000),
        (202, "Sales", 22_000),
        (301, "HR", 15_500),
        (302, "HR", 16_000),
    ]
    res = dept_vs_company(data)
from pprint import pprint
    pprint(res)

这段代码干的事儿很直接:先把“钱”和“人”分别记账,再统一结算平均数,最后对比谁高谁低;同时给员工打个“是否高于本部门平均”的标记,后续做绩效分析、奖金系数,这个布尔值就挺好用。

精度、异常和一点边角料

就是那个…两个坑别踩:

  • 精度:工资用 float 够用的话就 round 一下;要财务级精度就把 float 全换成 Decimal。
  • 异常:空部门、None 工资直接跳过;部门没人时不要算平均,结果里就不要放它。

如果数据规模很大,你还能把第一趟聚合写成“流式”的(比如分批从数据库读),内存压力会更小。真要再极致一点,用 Welford 在线算法也行,不过这题没必要。

想更“数据分析味儿”的写法

有人问我:“用 pandas 行不?”行,几行就完事,但得先装个包。我就不贴了,怕你环境没装…算了还是给一版,万一你正好在 Jupyter 里:

import pandas as pd

defdept_vs_company_pd(df: pd.DataFrame, ndigits: int = 2):
# df: columns = ["emp_id", "dept", "salary"]
    df = df.dropna(subset=["dept", "salary"]).copy()
    dept_avg = df.groupby("dept")["salary"].mean().round(ndigits)
    company_avg = round(df["salary"].mean(), ndigits)

    dept_vs = (dept_avg > company_avg).map({True: "higher", False: "lower"})
    dept_vs[dept_avg == company_avg] = "equal"

    df["above_dept_avg"] = df.apply(lambda r: r["salary"] > dept_avg[r["dept"]], axis=1)
return {
"company_avg": company_avg,
"dept_avg": dept_avg.to_dict(),
"dept_vs_company": dept_vs.to_dict(),
"employees": df.assign(salary=df["salary"].round(ndigits)).to_dict("records")
    }

好,就这样。哦对,等会儿我先把酸奶喝完…

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领