如何将多轮迭代结果合并为单个列表(实现flatten逻辑)
把多轮循环结果合并到同一列表的实现方法
要实现你想要的「多轮循环结果合并到单个列表」的效果,Python里有几种实用的写法,分情况给你列出来:
1. 列表推导式拼接(最直观)
直接把两个独立的列表推导式用+拼接,完全对应你示例里的分块逻辑,代码清晰易懂:
# 示例:第一个循环处理数字,第二个处理字符串 somethings = [1,2,3] others = ["a","b","c"] rules = [ # 第一个循环的动作:计算i的平方 i ** 2 for i in somethings ] + [ # 第二个循环的动作:把字符串转大写 s.upper() for s in others ] # 结果:[1,4,9,"A","B","C"]
如果每个循环里的动作会生成多个元素(比如每个迭代产生一个子列表),需要先展开的话,就在推导式里多套一层循环:
# 示例:每个i生成多个元素 def generate_from_i(i): return [i, i*10, i*100] def generate_from_s(s): return [s, s*2] rules = [ item for i in somethings for item in generate_from_i(i) ] + [ item for s in others for item in generate_from_s(s) ] # 结果:[1,10,100,2,20,200,3,30,300,"a","aa","b","bb","c","cc"]
2. 用itertools.chain合并(省内存)
如果处理的数据量很大,不想生成中间列表占用内存,可以用itertools.chain把多个迭代器合并,最后转成列表:
import itertools # 先定义两个迭代器(用生成器表达式,不占内存) iter_somethings = (i**2 for i in somethings) iter_others = (s.upper() for s in others) # 合并后转成列表 rules = list(itertools.chain(iter_somethings, iter_others)) # 处理多元素的情况同理 iter_somethings = (item for i in somethings for item in generate_from_i(i)) iter_others = (item for s in others for item in generate_from_s(s)) rules = list(itertools.chain(iter_somethings, iter_others))
3. 普通循环逐个添加(适合复杂逻辑)
如果循环里的动作逻辑比较复杂(比如有条件判断、多个分支),用普通循环更灵活:
rules = [] # 第一个循环 for i in somethings: # 这里可以写复杂的动作逻辑 if i > 1: rules.append(i**2) else: rules.append(i) # 第二个循环 for s in others: if len(s) == 1: rules.append(s.upper()) else: rules.append(s) # 如果每个迭代生成多个元素,用extend代替append # rules.extend(generate_from_i(i))
关键提示
- 如果你的循环动作会生成嵌套列表,一定要用
extend(或者推导式里的双层循环)来展开,不然列表里会嵌套子列表,达不到flatten的效果。 - 优先选列表推导式拼接,代码简洁易读;数据量大的时候用
itertools.chain更高效。
内容的提问来源于stack exchange,提问作者DISCO
相关产品推荐
相关产品推荐

