如何用Python核心语法实现类似SQL的列表连接操作?
基于Python核心语法实现元组列表的连接操作
首先定义两个原始列表:
list1 = [(100, 'Steven', '515.123.4567'), (101, 'Neena', '515.123.4568'), (102, 'Lex', '515.123.4569')] list2 = [(100, 'Engineer', '515.123.4567'), (101, 'Doctor', '515.123.4568')]
1. 内连接实现
先把list2转换成以元组首元素为键的字典,提升匹配效率:
# 构建映射字典:键为ID,值为对应职位 list2_dict = {item[0]: item[1] for item in list2} # 内连接:仅保留两边都存在对应ID的记录 inner_join = [] for item in list1: if item[0] in list2_dict: # 拼接原元组与匹配到的职位 inner_join.append(item + (list2_dict[item[0]],)) print(inner_join) # 输出:[(100, 'Steven', '515.123.4567', 'Engineer'), (101, 'Neena', '515.123.4568', 'Doctor')]
2. 左外连接实现
基于同一映射字典,遍历list1所有元素,无匹配项时用None填充:
# 左外连接:保留list1全部记录,无匹配项用None补位 left_outer_join = [] for item in list1: # get方法指定默认值,无匹配时返回None position = list2_dict.get(item[0], None) left_outer_join.append(item + (position,)) print(left_outer_join) # 输出:[(100, 'Steven', '515.123.4567', 'Engineer'), (101, 'Neena', '515.123.4568', 'Doctor'), (102, 'Lex', '515.123.4569', None)]
关键说明
- 用字典做映射将匹配操作的时间复杂度从O(n*m)降至O(n+m),比双重循环遍历更高效
- 元组通过
+操作符实现拼接,生成新的元组(元组为不可变类型) - Python中用
None替代需求中的null,语义一致
内容的提问来源于stack exchange,提问作者Jim Macaulay
相关产品推荐
相关产品推荐

