能否将给定yield函数转换为更简洁的条件列表推导式?
当然可以!而且转换后的列表推导式非常简洁清晰
先把你提到的生成器函数写出来方便对照:
def getList(l1, l2): for i in range(len(l1)): if l1[i] == 'sum': yield l2[i] else: yield l1[i]
对应的条件列表推导式可以直接写成基于索引的版本:
result = [l2[i] if l1[i] == 'sum' else l1[i] for i in range(len(l1))]
不过更Pythonic的写法是用zip()来同时遍历两个列表的元素,不用手动处理索引,可读性和简洁度都更好:
result = [val2 if item1 == 'sum' else item1 for item1, val2 in zip(l1, l2)]
简单解释:
zip(l1, l2)会把两个列表中对应位置的元素一一配对,比如第一个配对是('ID1', ''),第四个配对是('sum', 'Val1')- 列表推导式里的条件判断逻辑和你原来的生成器完全一致:如果l1的当前元素是
'sum',就取l2对应位置的元素,否则直接保留l1的元素
用你的示例数据测试一下:
l1 = ['ID1', 'ID2', 'ID3', 'sum', 'sum', 'sum'] l2 = ['', '', '', 'Val1', 'Val2', 'Val3'] result = [val2 if item1 == 'sum' else item1 for item1, val2 in zip(l1, l2)] print(result) # 输出: ['ID1', 'ID2', 'ID3', 'Val1', 'Val2', 'Val3']
完全符合预期的结果。
内容的提问来源于stack exchange,提问作者r.user.05apr
相关产品推荐
相关产品推荐

