Python:基于字典可用日期筛选可参加连续两天派对的人员
嘿,这个需求拆解开来其实很清晰,我来一步步帮你搞定!
核心思路
我们的目标是找出所有连续两天的日期组合,然后对每个组合筛选出两天都能参加的人员,最后可以根据参与人数选出最适配的日期。具体分三步:
- 统一处理日期格式,方便判断“连续两天”;
- 从所有人的可用日期中提取出所有有效的连续日期对;
- 对每个日期对,匹配出两天都有空的人员名单。
代码示例(Python)
假设你的人员字典结构如下(如果实际结构不同,只需微调字段名即可):
from datetime import datetime, timedelta # 示例:以HS为索引的人员信息字典 people_dict = { "HS001": {"name": "Alice", "available_dates": ["2024-05-10", "2024-05-11", "2024-05-13"]}, "HS002": {"name": "Bob", "available_dates": ["2024-05-10", "2024-05-11", "2024-05-12"]}, "HS003": {"name": "Charlie", "available_dates": ["2024-05-11", "2024-05-12", "2024-05-14"]} } # 第一步:将字符串日期转为datetime对象,方便判断连续 for hs_id, info in people_dict.items(): info['available_dates_dt'] = [datetime.strptime(date, "%Y-%m-%d") for date in info['available_dates']] # 第二步:收集所有可能的连续日期对 all_dates = set() for info in people_dict.values(): all_dates.update(info['available_dates_dt']) all_dates_sorted = sorted(all_dates) date_pairs = [] for i in range(len(all_dates_sorted) - 1): current = all_dates_sorted[i] next_day = all_dates_sorted[i+1] # 判断是否是连续的一天 if next_day - current == timedelta(days=1): date_pairs.append((current.strftime("%Y-%m-%d"), next_day.strftime("%Y-%m-%d"))) # 第三步:为每个日期对匹配可参加人员 party_options = {} for date1, date2 in date_pairs: attendees = [] for hs_id, info in people_dict.items(): # 检查两天是否都在该人员的可用列表中 if date1 in info['available_dates'] and date2 in info['available_dates']: attendees.append(info['name']) party_options[f"{date1} & {date2}"] = attendees # 输出所有可选日期的参与情况 print("所有可选日期组合及参与人员:") for dates, people in party_options.items(): print(f"- {dates}: {', '.join(people) if people else '无人能参加'}") # 找出参与人数最多的最优日期 if party_options: best_date, best_attendees = max(party_options.items(), key=lambda x: len(x[1])) print(f"\n最适配的日期是 {best_date},共有 {len(best_attendees)} 人参加:{', '.join(best_attendees)}") else: print("\n没有找到任何连续两天都有人能参加的日期组合!")
关键逻辑解释
- 日期格式转换:用
datetime处理日期可以避免字符串比较的误差(比如跨月份的连续日期,字符串无法直接判断); - 生成连续日期对:先收集所有出现过的可用日期,去重排序后,遍历判断相邻日期是否相差1天,得到所有有效的派对日期组合;
- 筛选参会人员:对每个日期组合,逐一检查人员是否两天都有空,收集符合条件的名单;
- 最优日期选择:通过
max函数按参会人数排序,直接选出最适配的日期。
如果你的人员字典结构和示例不同(比如可用日期的字段名不是available_dates),只需要修改代码中对应的字段引用即可~
内容的提问来源于stack exchange,提问作者William Merritt
相关产品推荐
相关产品推荐

