0
min(gameinfo.not_my_planets.values(), key=lambda p: p if p.num_ships < 35)

试图获得最小的星球,但只有在有 35 艘或更少船只的星球时。

尽管有任何想法,但得到意想不到的令牌')'?

4

3 回答 3

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)
于 2012-05-27T07:30:58.687 回答
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)

或者,如果行星对象没有比较运算符,则给mina 函数以获取它应该用于比较的属性,如下所示:

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
于 2012-05-27T07:41:42.417 回答
0

p if p.num_ships < 35其本身是无效的语法。如果 lambda 应该返回p.num_ships >= 35什么?您需要使用else;来完成它 例如p is p.num_ships < 35 else ...keyfor 参数中的要点min是为每个元素选择一个值,根据该值应该确定最小元素。

“仅当有 35 艘或更少船的行星时”是什么意思?你的意思是说,如果所有行星都有超过 35 艘船,那么你根本不想要一个最小行星吗?

于 2012-05-27T07:17:35.987 回答