2016-01-25 44 views
1

我有一個包含的行輸入文件:編寫Python兩級循環理解

key \t value1 \t value2 ..... 

我想讀這個文件放到一個字典,其中關鍵是該行的第一個標記和值值的列表。

我認爲這樣做會做到這一點,但蟒蛇給我一個錯誤,名稱l沒有定義。我如何編寫一個有兩個級別的「for」語句的理解?

f = open("input.txt") 
datamap = {tokens[0]:tokens[1:] for tokens in l.split("\t") for l in enumerate(f)} 
+0

我會建議使用CSV閱讀器模塊做這個工作,而不是手動拆分它自己。 https://docs.python.org/3/library/csv.html。另請參閱dictreader函數https://docs.python.org/3/library/csv.html#csv.DictReader – canyon289

+0

使用與嵌套循環相同的順序:'{... for l in enumerate(f)for l.split(「\ t」)}'中的標記。表達式可以想象成最內層循環的主體。 – chepner

回答

6

使用csv模塊並插入每一行成詞典:

import csv 

with open('input.txt') as tsvfile: 
    reader = csv.reader(tsvfile, delimiter='\t') 
    datamap = {row[0]: row[1:] for row in reader} 

這完全迴避了這個問題。

可以str.split()結果成一個元組創建一個「循環變量」:

datamap = {row[0]: row[1:] for l in f for row in (l.strip().split("\t"),)} 

這裏row被綁定到一個str.split()結果從元組,有效地創建一個row = l.strip().split('\t')「分配」 。

2

Martijn's一應俱全的完善過程,但只是爲了直接解決您與您的代碼中看到的問題:

首先,enumerate是不是做了什麼你覺得它在做什麼(雖然我不能完全肯定你認爲它在做什麼)。你可以擺脫它。

其次,Python是試圖解決此問題:它看到你定義l因爲什麼

tokens[0]:tokens[1:] for tokens in l.split("\t") 

之前。你可以把括號圍繞第二理解,使之評價爲你想要的結果:

datamap = {tokens[0]:tokens[1:] for tokens in (l.split("\t") for l in f)} 
+0

謝謝!我對此很好奇。 :) – pandagrammer