如何写出Python单行列表推导式实现相邻元素配对的邪典代码
Python邪典单行列表推导式配对实现思路
下面所有实现均满足要求:仅with open为外部语句,所有逻辑封装在单行列表推导式内,无显式中间变量定义。
实现1:迭代器切片配对(最简洁款)
利用列表推导式内部for临时变量特性,直接在推导式内部预生成转换后的整数序列,用zip配对相邻元素,补全末尾占位:
with open("file") as f: [(a, b) for seq in [[*map(int, f.read().split())]] for a, b in zip(seq, seq[1:] + [object()])]
*注:末尾的object()可替换为你需要的任意占位值,比如None、?对应的字符串等。
实现2:locals存状态(纯邪典款)
完全利用推导式作用域的locals()字典存储临时缓存,无任何显式序列预生成,全程边迭代边配对:
with open("file") as f: [locals().setdefault('res', []).append((locals()['prev'], curr)) if 'prev' in locals() else None, locals().__setitem__('prev', curr)][0] for curr in map(int, f.read().split())] + [(locals()['prev'], None)]
*注:利用逗号表达式的返回值特性,把状态更新逻辑塞到推导式的迭代逻辑里,完全符合语法规则。
实现3:动态索引访问(无zip款)
不用zip,直接通过索引访问相邻元素,适合需要自定义配对逻辑的场景:
with open("file") as f: [(seq[i], seq[i+1] if i < len(seq)-1 else None) for seq in [[*map(int, f.read().split())]] for i in range(len(seq))]
注意事项
- 所有实现均仅用于炫技,生产环境严禁使用,可读性和性能都远低于普通实现
- 如果要修改占位符,直接替换末尾的
None/object()即可 - 若读取的文件内容为空,可自行加判断逻辑塞到推导式的
if条件里
内容的提问来源于stack exchange,提问作者Grey
相关产品推荐
相关产品推荐

