min(gameinfo.not_my_planets.values(), key=lambda p: p if p.num_ships < 35)
最小の惑星を取得しようとしていますが、船が 35 個以下の惑星がある場合のみです。
予期しないトークン ')' を取得しますが、アイデアはありますか?
そのラムダのポイントが何であるかさえわかりません...別の答えへのコメントであなたが言ったことに行きます:
「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
ラムダ式の一部が抜けelse
ていますが、次のように書き直したほうがよいでしょう:
min(filter(lambda p: p.num_ships < 35, gameinfo.not_my_planets.values()))
filer(...)
は、惑星のシーケンスを を持つものに減らしnum_ships < 35
ます。オブジェクトはそれら自体に匹敵しますか、それともplanet
属性惑星と比較する必要があります
planet.size
か? その場合は、別のラムダを追加する必要があります。
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)
p if p.num_ships < 35
単独では無効な構文です。次の場合、ラムダは何を返す必要がありp.num_ships >= 35
ますか? else
;で完了する必要があります。例えばp is p.num_ships < 35 else ...
。key
の引数のポイントはmin
、最小要素を決定する各要素の値を選択することです。
「35隻以下の惑星がある間だけ」とはどういう意味ですか? すべての惑星に 35 隻以上の船がある場合、最小の惑星がまったく必要ないということですか?