2014-02-14 124 views
0

我有這樣的xlib元素的列表:語法錯誤

<Choice ID="91149" Total="21"/> 
<Choice ID="91139" Total="14"/> 
<Choice ID="91159" Total="58"/> 

我要挑有ID的元素= 91149.在.NET中,我可以做類似

element91149 = (from p in choices where p.id=91149).first 

我想在Python中的語法,從this例如工作從Python教程...

#example from documentation = x for x in 'abracadabra' if x not in 'abc' 

我的執行:

h = x for x in results if x.get("ID")=="91149" #invalid syntax 

我在做什麼錯?

+0

你想只挑一個這樣的項目?如果是,那麼不要使用LC。 –

+0

這可能不是在Python中執行此操作的正確方法。一般來說,除非你試圖獲得列表,否則不會使用列表解析。例如,如果你想得到所有的「91000」ID,你可以做'[[91000] <= result.get(「ID」)<=「91999」]「' –

+0

@adsmith什麼是我應該用來選擇一個元素的構造?只是想知道,所以我可以谷歌它 – bernie2436

回答

7

List comprehensions必須用方括號[...]括:

h = [x for x in results if x.get("ID")=="91149"] 

只是爲了記錄在案,使用普通的括號(...)將創建一個generator expression

h = (x for x in results if x.get("ID")=="91149") 

然而,隨着@Ashwini提到當所有你想要的是第一個項目時,將整個列表讀入內存通常是非常低效的t符合條件。

相反,它通常快得多使用next和發電機的表達:

h = next(x for x in results if x.get("ID")=="91149") 

與列表比較。 (一次完成),此解決方案將一次產生一個項目。而且,一旦找到符合條件的物品,它就會停止。

但要注意,如果它找不到該項目,它也會引發一個StopIteration錯誤。爲了避免這種情況,你可以給next的默認值返回:

h = next((x for x in results if x.get("ID")=="91149"), None) 

在這種情況下,h將被分配到None如果滿足以下條件,項目無法找到。

+0

很高興看到簡單的解決方案:) –