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

最小の惑星を取得しようとしていますが、船が 35 個以下の惑星がある場合のみです。

予期しないトークン ')' を取得しますが、アイデアはありますか?

4

3 に答える 3

1

そのラムダのポイントが何であるかさえわかりません...別の答えへのコメントであなたが言ったことに行きます:

「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
于 2012-05-27T07:41:42.417 に答える
1

ラムダ式の一部が抜け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)
于 2012-05-27T07:30:58.687 に答える
0

p if p.num_ships < 35単独では無効な構文です。次の場合、ラムダは何を返す必要がありp.num_ships >= 35ますか? else;で完了する必要があります。例えばp is p.num_ships < 35 else ...keyの引数のポイントはmin、最小要素を決定する各要素の値を選択することです。

「35隻以下の惑星がある間だけ」とはどういう意味ですか? すべての惑星に 35 隻以上の船がある場合、最小の惑星がまったく必要ないということですか?

于 2012-05-27T07:17:35.987 に答える