demo_2for.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 两层 for 循环列表生成式(列表推导式)学习脚本
  5. 功能:演示如何从嵌套数据结构中提取数据,并生成新的字典列表。
  6. """
  7. # ==================== 第一部分:模拟原始数据 ====================
  8. # # 假设这是从资质评审系统中获取的维度评分数据
  9. # dimension_scores = [
  10. # {"dimension": "技术能力", "issues": ["代码可读性差", "缺少单元测试"]},
  11. # {"dimension": "沟通协作", "issues": ["会议发言不积极"]},
  12. # {"dimension": "项目管理", "issues": []}, # 空列表,表示该维度没有问题
  13. # {"dimension": "学习能力", "issues": ["技术文档更新不及时"]}
  14. # ]
  15. #
  16. # print("【原始数据结构】")
  17. # for dim in dimension_scores:
  18. # print(f"维度:{dim['dimension']},问题列表:{dim['issues']}")
  19. # print("\n" + "=" * 50 + "\n")
  20. #
  21. #
  22. # # ==================== 第二部分:你的原始代码(带详细拆解注释) ====================
  23. # issues = [
  24. # # 1. 这是每次循环要生成的"元素"(一个字典)
  25. # {
  26. # "priority": "medium", # 固定字段
  27. # "dimension": dim["dimension"], # 从外层循环变量 dim 中取值
  28. # "description": issue, # 从内层循环变量 issue 中取值
  29. # "location": "资质材料全文", # 固定字段
  30. # "suggestion": "请参考评审建议修改" # 固定字段
  31. # }
  32. # # 2. 外层 for 循环:遍历 dimension_scores 列表中的每个字典,赋给变量 dim
  33. # for dim in dimension_scores
  34. # # 3. 内层 for 循环:遍历当前 dim 中 "issues" 键对应的列表,
  35. # # 将每个元素赋给变量 issue;若该列表为空,则内层循环不执行,自动跳过
  36. # for issue in dim.get("issues", [])
  37. # ]
  38. #
  39. # print("【使用两层列表生成式生成的问题列表(你的原始写法)】")
  40. # print(f"issues-->{issues}")
  41. # # 漂亮的打印输出,方便查看结构
  42. # for item in issues:
  43. # print(f"维度:{item['dimension']},问题:{item['description']}")
  44. # print(f"总共生成 {len(issues)} 条问题记录。")
  45. # print("\n" + "=" * 50 + "\n")
  46. #
  47. #
  48. # # ==================== 第三部分:等价的普通 for 循环写法(对比理解) ====================
  49. # # 为了让你更直观地理解上述代码的执行流程,这里写出完全等价的普通循环版本
  50. # issues_loop = [] # 创建一个空列表用于存放结果
  51. #
  52. # # 外层循环:遍历每个维度
  53. # for dim in dimension_scores:
  54. # # 内层循环:遍历当前维度下的问题列表(如果为空,则循环体不执行)
  55. # for issue in dim.get("issues", []):
  56. # # 组装字典,添加到结果列表中
  57. # issues_loop.append({
  58. # "priority": "medium",
  59. # "dimension": dim["dimension"],
  60. # "description": issue,
  61. # "location": "资质材料全文",
  62. # "suggestion": "请参考评审建议修改"
  63. # })
  64. #
  65. # # 验证两种写法结果是否一致
  66. # print("【验证:普通循环生成的结果是否与列表生成式一致?】")
  67. # print(f"列表生成式结果:{issues}")
  68. # print(f"普通循环结果:{issues_loop}")
  69. # print(f"两者相等吗? {issues == issues_loop}") # 输出 True 表示完全一样
  70. # print("\n" + "=" * 50 + "\n")
  71. # ==================== 第四部分:最简两层循环示例(彻底搞懂执行顺序) ====================
  72. # 抛开业务逻辑,用最简单的数字和字母展示两层 for 的执行顺序
  73. colors = ['红', '蓝']
  74. sizes = ['大', '中', '小']
  75. # 普通循环写法
  76. print("【普通嵌套循环执行顺序】")
  77. for color in colors: # 外层先固定 '红'
  78. for size in sizes: # 内层遍历 '大','中','小'
  79. print(f"{color}{size}", end=" ") # 输出:红大 红中 红小
  80. # 外层换到 '蓝',内层再次遍历 '大','中','小'
  81. print("\n") # 换行
  82. #
  83. # # 列表生成式写法(完全等价)
  84. combined = [f"{color}{size}" for color in colors for size in sizes]
  85. # print("【列表生成式执行结果】")
  86. print(combined) # 输出:['红大', '红中', '红小', '蓝大', '蓝中', '蓝小']
  87. print("\n" + "=" * 50 + "\n")
  88. #
  89. #
  90. # # ==================== 第五部分:附加技巧——带过滤条件的多层推导 ====================
  91. # # 如果你只想保留问题描述长度大于 4 的问题(例如过滤掉过短的无效内容)
  92. #
  93. # filtered_issues = [
  94. # {
  95. # "dimension": dim["dimension"],
  96. # "issue_text": issue
  97. # }
  98. # for dim in dimension_scores
  99. # for issue in dim.get("issues", [])
  100. # if len(issue) > 4 # 过滤条件:只保留长度大于4的问题描述
  101. # ]
  102. #
  103. # print("【带过滤条件的结果(只保留长度 > 4 的问题)】")
  104. # print(filtered_issues)
  105. # # 预期输出:只保留 '代码可读性差'(6个字) 和 '技术文档更新不及时'(8个字),
  106. # # '缺少单元测试'(5个字) 也满足,'会议发言不积极'(6个字) 也满足,都会保留。
  107. # # 若想测试过滤,可以修改条件,例如 len(issue) > 6 则只会保留 '技术文档更新不及时'