orders = [ ["34587",("5464", 4, 9.99), ("8274",18,12.99), ("9744", 9, 44.95)],
["34588",("5464", 9, 9.99), ("9744", 9, 44.95)],
["34588",("5464", 9, 9.99)],
["34587",("8732", 7, 11.99), ("7733",11,18.99), ("9710", 5, 39.95)] ]
我想要一个新的结果列表,第一个元素(" 34587")和元组中的其他元素相乘(例如:4 * 9.99,18 * 12.99,9 * 44.95)
可以使用map()
:
list(map(lambda x: [x[0]] + list(map(lambda y: y[1]*y[2], x[1:])), orders))
结果:
[['34587', 39.96, 233.82, 404.55], ['34588', 89.91, 404.55], ['34588', 89.91], ['34587', 83.93, 208.89, 199.75]]
问题是,这个map()示例可以重写为列表理解吗?
感谢。
答案 0 :(得分:3)
在一条评论中,使用lambda映射:
list(map(lambda y: expression_involving_y, elements))
可与列表推导交换:
[expression_involving_y for y in elements]
您可以从替换内部地图开始:
list(map(lambda x: [x[0]] + list(map(lambda y: y[1]*y[2], x[1:])), orders))
elements
为x[1:]
而expression_involving_y
为y[1]*y[2]
:
list(map(lambda x: [x[0]] + [ y[1]*y[2] for y in x[1:] ], orders))
你可以重复替换以最终得到你的结果:
[ [x[0]] + [ y[1]*y[2] for y in x[1:] ] for x in orders ]