2013-02-28 57 views
1

我遇到,我重構成爲這一些Python代碼V2.7:這個Python循環可以更簡潔地表達嗎?

for ssid in (ssid for ssid in overlaps 
      if ssid != subseq_id and ssid not in merged): 

但感覺對我來說,應該有表達這種不使用兩個for語句的方法嗎?

+0

嚴格來說,這是一個'for'語句包含一個lis理解,而不是兩個「for」陳述。關鍵字'for'有兩個用途是一種巧合。 – minopret 2013-02-28 21:56:51

+1

@minopret它不是一個列表理解,它是一個生成器表達式 – 2013-02-28 22:13:49

+1

好吧,是的,它會產生一個懶惰列表而不是嚴格的列表,因爲我說「嚴格」我可能已經鑽研到這個細節:-) – minopret 2013-02-28 22:18:50

回答

14

你可以使用filter()

for ssid in filter(lambda s: s != subseq_id and s not in merged, overlaps): 
    # ... 

,或者你可能只是測試在循環

for ssid in overlaps: 
    if ssid == subseq_id or ssid in merged: 
     continue 
    # ... 
+1

+1第二種選擇。如果你不希望'ssid == subseq_id'經常是'True',那麼交換測試可能會更有效率 – 2013-02-28 22:16:09

0

根據數據(順序並不重要,......),你可以使用集合:

excluded = set(merged) 
excluded.add(subseq_id) 
ssids = set(overlaps) - excluded 
for ssid in ssids: 
    ... 
相關問題