min(gameinfo.not_my_planets.values(), key=lambda p: p if p.num_ships < 35)
试图获得最小的星球,但只有在有 35 艘或更少船只的星球时。
尽管有任何想法,但得到意想不到的令牌')'?
您错过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)
我不确定那个 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
a 函数以获取它应该用于比较的属性,如下所示:
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
p if p.num_ships < 35
其本身是无效的语法。如果 lambda 应该返回p.num_ships >= 35
什么?您需要使用else
;来完成它 例如p is p.num_ships < 35 else ...
。key
for 参数中的要点min
是为每个元素选择一个值,根据该值应该确定最小元素。
“仅当有 35 艘或更少船的行星时”是什么意思?你的意思是说,如果所有行星都有超过 35 艘船,那么你根本不想要一个最小行星吗?