2012-04-25 18 views
10

首先請原諒我有點不好的標題。我不太確定該怎麼說。如果有人可以建議一個更好的標題,那就太棒了。Python列表理解拆分循環變量

我想知道是否有辦法將列表理解的每個迭代的值分割一次,但在輸出中使用它兩次。我試圖解決這個問題的一個例子是:

我有串

a = "1;2;4\n3;4;5" 

而且我想執行此:

>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5] 
[('2', '4'), ('4', '5')] 

在不需要運行分裂三次。因此,像這樣(這顯然是無效的語法,但希望是足以讓整個消息):

[(x[1],x[2]) for x.split(";") in a.split("\n") if x[1] != 5] 

在這個問題上,我尋找花哨的方式來獲取字符串的第2和第3列。這只是提供具體例子的一種方式。我能爲課程的例子使用:

[x.split(";")[1:3] for x in a.split("\n")] 

我已經想到了可能的解決方案:

  1. 不使用列表理解
  2. 將它保持不變
  3. 使用csv.DictReader ,命名我的專欄和類似StringIO的東西給它輸入。

這主要是一些可以使用而不是特定情況的好模式,所以它很難回答「你爲什麼要這樣做」或「這是什麼」有點問題

感謝提前:)

UPDATE:是讀解下面我去跑一些速度測試之後。我在非常基本的測試中發現,所提供的解決方案比上述天真的解決方案快35%。

回答

16

你可以使用一個列表理解周圍生成器表達式包裹:

[(x[1],x[2]) for x in (x.split(";") for x in a.split("\n")) if x[1] != 5] 
+0

感謝非常酷:) – Nick 2012-04-25 04:06:29