min(gameinfo.not_my_planets.values(), key=lambda p: p if p.num_ships < 35)
试图获得最小的行星,但只有在有35艘或更少的船只的行星时。
获得意外的令牌')'虽然有任何想法?
答案 0 :(得分:1)
你错过了else
lambda表达式的一部分,但你最好将它重写为:
min(filter(lambda p: p.num_ships < 35, gameinfo.not_my_planets.values()))
filer(...)
会将行星序列减少到num_ships < 35
的行星。 planet
个对象在它们之间是否具有可比性,或者您应该与属性行星进行比较,
planet.size
?如果是这样,你必须添加另一个lambda:
min(filter(lambda p: p.num_ships < 35, gameinfo.not_my_planets.values()), key=lambda p:p.size)
如果你不习惯功能结构,只需使用简单的列表理解(我假设行星在它们之间是可比的):
min( p for p in gameinfo.not_my_planets.values() if p.num_ships < 35)
答案 1 :(得分:1)
我不确定那个lambda的意思是什么......按照你所说的你想要的另一个答案的评论:
“选择35艘或更多船只的行星”:
planets_35_or_higher = [p for p in gameinfo.not_my_planets.values()
if p.num_ships >= 35])
“选择最少的剩余部分”:
planets_below_35 = [p for p in gameinfo.not_my_planets.values()
if p.num_ships < 35])
min_planet_below_35 = min(planets_below_35)
或者,如果行星对象没有比较运算符,请给min
一个函数来获取它应该用于比较的属性,如下所示:
min_planet_below_35 = min(planets_below_35, key=lambda p: p.num_ships)
另外,为了解决没有35艘船只的行星的可能性:
if planets_below_35:
min_planet_below_35 = min(planets_below_35)
else:
# do something else
答案 2 :(得分:0)
p if p.num_ships < 35
本身就是无效的语法。如果p.num_ships >= 35
,lambda应该返回什么?您需要使用else
完成此操作;例如p is p.num_ships < 35 else ...
。 key
min
参数中的点是为每个元素选择一个值,通过该值确定最小元素。
“只有在有35艘或更少船只的行星”时才是什么意思?如果所有行星都有超过35艘船,你的意思是你根本不想要最小的行星吗?