如何用Python列表推导式无第三方库生成指定结构的0-1矩阵
实现方案
正确列表推导式写法
你之前的写法核心问题是遍历顺序和判断逻辑搞反了,正确的逻辑是外层遍历l2的每个子列表(对应矩阵每一行),内层遍历l1的每个元素(对应矩阵每一列),判断当前l1元素是否在当前l2子列表中,直接生成对应值即可,不需要先初始化全0矩阵:
# 基础写法 A = [[1 if item in sublist else 0 for item in l1] for sublist in l2] # 简化写法:布尔值转int时True对应1、False对应0,可以直接用int()转换 A = [[int(item in sublist) for item in l1] for sublist in l2]
大数据量优化方案
因为你提到处理的数据集体量极大,列表的in操作时间复杂度是O(n),每次判断都要遍历整个子列表,性能开销很高,可以先把l2的所有子列表转成集合,集合的in操作时间复杂度是O(1),整体性能会有数量级提升:
# 先将l2的子列表全部转成集合,降低后续查找开销 l2_sets = [set(sublist) for sublist in l2] # 生成矩阵 A = [[int(item in sub_set) for item in l1] for sub_set in l2_sets]
用你给出的示例参数运行后,得到的A结果为[[1, 0, 1, 0], [0, 0, 1, 0], [0, 1, 1, 1]],和你预期的矩阵结构完全一致。
内容的提问来源于stack exchange,提问作者francesco pagano
相关产品推荐
相关产品推荐

