Python生成无重复新列表 其余关联列表与首个去重列表对齐
关联列表去重对齐实现方案
问题核心要求
处理三组索引一一对应的关联列表:
NamesFromForum:存在重复姓名的用户名列表AgesFromForum:和姓名列表索引对应的年龄列表LocFromForum:和姓名列表索引对应的所在地列表
需要生成三组顺序严格对齐的新列表:- 去重后无重复的姓名列表,保留姓名首次出现的顺序
- 对齐后的年龄列表,每个位置对应同索引姓名首次出现时的年龄值
- 对齐后的所在地列表,每个位置对应同索引姓名首次出现时的所在地值
常见错误原因
之前代码运行后年龄、所在地列表为空,基本是两个原因:
- 遍历去重时仅单独处理了姓名字段,没有同步追加对应位置的年龄、所在地数据
- 遍历过程中没有同步获取元素索引,无法定位到对应位置的年龄、所在地值
可直接运行的正确实现
基础兼容写法(全Python版本通用)
用enumerate遍历同时拿到索引和姓名,首次遇到新姓名时,同步追加三个列表的对应值:
# 原始测试数据示例 NamesFromForum = ["张三", "李四", "王五", "张三", "赵六", "李四", "孙七"] AgesFromForum = [22, 25, 30, 23, 28, 26, 31] LocFromForum = ["北京", "上海", "广州", "深圳", "杭州", "南京", "成都"] seen = set() unique_names = [] aligned_ages = [] aligned_locs = [] for idx, name in enumerate(NamesFromForum): if name not in seen: seen.add(name) unique_names.append(name) aligned_ages.append(AgesFromForum[idx]) aligned_locs.append(LocFromForum[idx])
简洁写法(适配Python3.7+,字典默认保留插入顺序)
用字典自动去重,键存姓名,值存首次出现时对应的年龄和所在地,最后拆分字典即可:
name_info = {} for name, age, loc in zip(NamesFromForum, AgesFromForum, LocFromForum): if name not in name_info: name_info[name] = (age, loc) unique_names = list(name_info.keys()) aligned_ages = [age for age, loc in name_info.values()] aligned_locs = [loc for age, loc in name_info.values()]
结果验证
运行后输出结果完全符合对齐要求:
去重姓名列表: ['张三', '李四', '王五', '赵六', '孙七'] 对齐年龄列表: [22, 25, 30, 28, 31] 对齐所在地列表: ['北京', '上海', '广州', '杭州', '成都']
注意:如果原始三个列表长度不一致,建议先加长度校验逻辑,避免索引越界。
内容的提问来源于stack exchange,提问作者Jay Van
相关产品推荐
相关产品推荐

