2016-04-19 103 views
-1

如何將2 for循環放入if語句中?如何將2 for循環嵌套到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]) 

預期輸出:

Aircraft Carrier 

這是因爲如果他們都重複一次,然後船應等於"A"和名稱應該是["Aircraft Carrier", 5],所以name[0][0]應該"A"

你將如何做到這一點它的代碼獨立迭代通過兩個列表和分支給定的語句關聯兩個列表?

+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()函數;否則你必須做兩次相同的計算。

你也不需要兩個循環;您只需要遍歷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

我不是那個倒票的人,但是我正在尋找的是一種方法來將兩個語句放在一行中,因爲我希望它更緊湊,再加上我不能在這個程序中創建更多變量 –

+0

@Frostyfeet:兩個用於語句*對你來說沒有意義*要求。你最終會生成兩個列表的產品,在一個列表中測試每個列表的名稱,而不是另一個列表中的所有名稱。這是非常低效的,根本不需要。 –

+0

@Frostyfeet:如果你把循環放到你的'if'語句中,你必須再次做相同的循環才能打印匹配的名字。這是變量的優點,可以存儲結果,因此不必再計算一次。 –