2016-04-19 9 views
-1

if文の中に2 forループをどのように入れますか?2つのforループを1つのif文にネストする方法

Ships = [ 
    ["Aircraft Carrier", 5], 
    ["Battleship", 4], 
    ["Submarine", 3],  
    ["Destroyer", 3], 
    ["Patrol Boat", 2] 
] 
ships_left = ["A","B","S","D","P"] 

if [ship for ship in ships_left name for name in Ships if name[0][0] == ship]: 
    print(name[0]) 

予想される出力は:彼らの両方が一度繰り返すならば、船が"A"と同じである必要があり、名前はそうname[0][0]"A"をする必要があり、["Aircraft Carrier", 5]する必要がありますので

Aircraft Carrier 

です。

これは、両方のリストを独立して反復し、2つのリストを関連付ける特定のステートメントで分岐する方法です。

+1

あなたは私たちに期待される出力を提供することはできますか? – Aurel

+0

論理を説明し、出力として何をしたいのですか?最初の試合だけを望むならば、なぜすべての船に反復するのですか? –

+0

テストしている状態は何ですか? 「*実際に働く」とはどういう意味ですか?あなたは達成しようとしていることを教えていない。 – cdarke

答えて

2

いかなるがあったかどうかをテストするifを使用する前に、最初を残しているか船計算:

left_names = [name for name, size in Ships if name[0] in ships_left] 
if left_names: 
    print(left_names[0]) 

は、船舶が最初に残っているものを計算することによって、あなたはifテストの両方の結果を再利用することができますおよびprint()機能;それ以外の場合は、同じ計算を2回行う必要があります。

また、2つのループは必要ありません。 Shipsリストをループし、各名前をships_leftリストと照合するだけです。私は、より高速なメンバーシップのテストのために、しかし、ships_leftセット作りたい:リストで

ships_left = {"A", "B", "S", "D", "P"} 

メンバーシップ・テストは、(Nはリストの長さである)Nステップに取り、セット・メンバーシップ・テストにかかるながら、一定時間(O(1))。これは、それが(ボード上または配置)撃沈されていたら速く簡単すぎると船を取り除く作る:

ships_left.remove(name[0]) 

あなただけ最初の一致が必要な場合は、ジェネレータ式でnext()機能を使用することができます。これは、すべての名前を抽出回避:

ship_left = next((name for name, size in Ships if name[0] in ships_left), None) 
if ship_left: 
    print(ship_left) 

デモ:

>>> Ships = [ 
...  ["Aircraft Carrier", 5], 
...  ["Battleship", 4], 
...  ["Submarine", 3], 
...  ["Destroyer", 3], 
...  ["Patrol Boat", 2] 
... ] 
>>> ships_left = {"A", "B", "S", "D", "P"} 
>>> next((name for name, size in Ships if name[0] in ships_left), None) 
'Aircraft Carrier' 
>>> ships_left.remove('A') 
>>> next((name for name, size in Ships if name[0] in ships_left), None) 
'Battleship' 
>>> ships_left.clear() # remove all ships 
>>> next((name for name, size in Ships if name[0] in ships_left), None) is None 
True 
+1

私はダウン投票した人ではありませんでした。私が探しているのは、コンパクトにするために、2つのステートメントを1行に入れる方法です。さらに、このプログラムで変数を作成することはできません。 –

+0

@Frostyfeet:2つのステートメント*は意味がありません。要件。結局のところ、2つのリストの製品を生産し、それぞれの名前を別の名前でテストしてみましょう。それは非常に非効率的で、全く必要ではありません。 –

+0

@Frostyfeet: 'if'ステートメントにループを置くと、同じ名前を表示できるように*同じループをもう一度*実行する必要があります。これは、結果を格納するために、変数を大きくしているため、再度計算する必要はありません。 –

関連する問題