Python:意外的令牌

时间:2012-05-27 07:11:15

标签: python lambda

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

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

获得意外的令牌')'虽然有任何想法?

3 个答案:

答案 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艘船,你的意思是你根本不想要最小的行星吗?