如何在列表推导中使用*运算符简化Line2D参数赋值?
解决方案:用字典解包简化参数赋值
当然可以用Python的解包语法简化代码,不过因为Line2D的label是关键字专属参数(无法通过位置参数传递),结合字典解包会更贴合你的需求,同时也能用到你关注的解包思路:
优化后的代码
from matplotlib.pyplot import Line2D COLOR_FCT = { "a": ["blue", "Al", "-"], "b": ["orange", "Bv", "-"], "c": ["green", "Cx", "-"], "d": ["k", "Ds", "--"], } # 用zip将列表元素与参数名映射为字典,再通过**解包 legend = [ Line2D( [0], [0], lw=2, **dict(zip(["color", "label", "ls"], COLOR_FCT[item])) ) for item in ["a", "b", "c"] ]
思路说明
- 用
zip(["color", "label", "ls"], COLOR_FCT[item])把每个条目里的三个元素和对应参数名配对,生成("color", "blue"), ("label", "Al"), ("ls", "-")这类键值对; - 用
dict()将键值对转换成参数字典,比如{"color": "blue", "label": "Al", "ls": "-"}; - 最后用
**运算符把字典解包为Line2D的关键字参数,省去手动逐个赋值的步骤。
关于*运算符的补充
如果你想用*位置解包,需要注意:Line2D的位置参数里没有label,它只能通过关键字传递。所以单纯用*无法覆盖所有需要的参数,若只处理color和ls可以这样写(但不如字典解包简洁):
# 仅作示例,实用性不强 color, label, ls = COLOR_FCT[item] Line2D([0], [0], lw=2, color=color, ls=ls, label=label)
这本质是序列解包,但和你期望的直接解包参数的场景有区别。
核心知识点
*用于解包位置参数(将列表、元组等可迭代对象的元素依次作为位置参数传递);**用于解包关键字参数(将字典的键值对作为命名参数传递);zip()可将多个可迭代对象按位置配对,是构造参数映射的常用工具。
内容的提问来源于stack exchange,提问作者MatPl
相关产品推荐
相关产品推荐

