2017-04-27 56 views
1

如果我要生成基於文檔的行元素的元組的列表,我可以這樣做:拆包列表理解內部分裂

[(line.split()[0], line.split()[-1][3:8]) for line in open("doc.txt")] 

例如(我加了分片顯示,我可能希望對分割的元素使用一些操作)。

不過我想避免使用分裂兩次,因爲這是效率不高。
所以我想使用類似拆包,與

[(linesplit0, linesplit1[3:8]) for line in open("doc.txt") for (linesplit0, linesplit1) in line.split()] 

但不能因爲工作中有沒有分裂的元組,因此在分割的每個元素,我們將缺少一個元素。

我想要的是允許使用佔位符名稱作爲分割結果的列表(如splittedlist或其他),並且可以與索引(splittedlist [0])一起使用,或者解包或兩者) ,並且這將與理解列表語法兼容。

是否可行?

+1

'[(拉姆達話:(字[0],詞語[-1] [3:8]))(line.split()),例如,開放線( 「doc.txt」)]' –

+1

使用一個嵌套發生器表達式:'[(LS [0],LS [-1] [3:8]),用於(line.split LS(),例如,開放( 'doc.txt' 線)。'把發電機表達在一個單獨的行中,如果需要爲了可讀性而在一個變量中。 –

+0

對不起,重複的,但是表達式並沒有幫助找到它 –

回答

2

您可以在開放的使用map(python3)或itertools.imap(python2):

[(line[0], line[-1][3:8]) for line in map(str.split, open("doc.txt"))] 

或使用發電機:

[(line[0], line[-1][3:8]) for line in (l.split() for l in open("doc.txt"))] 
+0

謝謝,這也很好,我有一個生成器的另一個答案,但你的使用,而不是另一種語法。不是嵌套因爲嵌套是 [A「對於b在c代表在b] 儘管你的是[A」爲在(b」爲C b)](裸露的中間處理這可能是你想要的任何和在字母旁邊標有(「'」) 那麼y怎麼會你稱這種語法? 「級聯」?有一個特定的名稱來區分它與嵌套? –

+1

有兩種不同的嵌套。這個嵌套在另一個不同的發電機內。沒有括號,你有一個單一的生成器,但使用嵌套理解迭代器(理解的'for'部分)。 – chepner

+1

生成器語法返回一個對象生成器,所以'(x for x in whatever)'返回一個生成器對象然後它在列表理解中使用@AndoJurai – Netwave

2

您可以使用map與不受約束的方法str.split

[(linesplit[0], linesplit[-1][3:8]) for linesplit in map(str.split, open("doc.txt"))] 

但是我會遠離這些;我想改用發電機:

def read_input(filename): 
    with open(filename) as f: 
     for line in f: 
      parts = line.split() 
      yield parts[0], parts[-1][3:8] 

這可能是多一點,但它更容易跟蹤 - 和可讀性計數 - 並且用戶使用read_input('doc.txt')因爲如此,或包成一個之間的選擇列表如果需要。

+0

聰明。通過「像這樣使用它」,你是否意味着例如作爲迭代器?發電機本身的其他用例是什麼? –