2014-02-19 70 views
0

我有生成28個詞典列表的代碼。它循環28個文件並鏈接來自適當字典中每個文件的數據點。爲了使我的代碼更靈活,我想用:創建詞典列表

tegDics = [dict() for x in range(len(files))] 

但是當我運行的代碼的第一個27本字典是空白,只有最後,tegDics [27],有數據。下面是包括笨拙,但實用,代碼我在使用該代碼生成字典:

x=0 
import os 
files=os.listdir("DirPath") 
os.chdir("DirPath") 
tegDics = [{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}] # THIS WORKS!!! 
#tegDics = [dict() for x in range(len(files))] - THIS WON'T WORK!!! 
allRads=[] 
while x<len(tegDics): # now builds dictionaries 
    for line in open(files[x]): 
     z=line.split('\t') 
     allRads.append(z[2]) 
     tegDics[x][z[2]]=z[4] # pairs catNo with locNo 
    x+=1 

有誰知道爲什麼更優雅的代碼不起作用。

回答

6

由於您在列表理解範圍內使用x,因此在達到while循環時它將不再爲零 - 它將代替爲len(files)-1。我建議將你使用的變量改爲別的。使用單個下劃線表示您不關心的值是傳統的。

tegDics = [dict() for _ in range(len(files))] 

這可能是消除你的x使用完全有用。 Python中習慣使用直接遍歷序列中的對象,而不是使用計數器變量。雖然它在你的情況稍微棘手,因爲你想在同一時間通過tegDicsfiles同時迭代

for tegDic in tegDics: 
    #do stuff with tegDic here 

:你可能會做這樣的事情。您可以使用zip來做到這一點。

import os 
files=os.listdir("DirPath") 
os.chdir("DirPath") 
tegDics = [dict() for _ in range(len(files))] 
allRads=[] 
for file, tegDic in zip(files,tegDics): 
    for line in open(file): 
     z=line.split('\t') 
     allRads.append(z[2]) 
     tegDic[z[2]]=z[4] # pairs catNo with locNo 
+0

- 尼斯找到!我錯過了'x'被重用。您應該向OP講解Python循環的''for each''性質,以及'enumerate()'或'zip()'。 –

+0

不知道_約定,假設通過 – deinonychusaur

+0

與gettext習慣混合有點危險如果你擔心這樣的混淆,可以隨意脫離約定。我也喜歡使用'i'作爲我的「變量,除了'range'循環之外,它不會用於任何其他的變量。 – Kevin

-2

反正有一個恕我直言最簡單的方法:

taegDics = [{}]*len(files) 
+4

雖然這有一個驚人的效果。如果你嘗試'dicts = [{}] * 2;類型的字典[0] [0] = 99;打印詞典「,你會發現_both_詞典有一個」99「條目,即使你只設置了一個! – Kevin

+0

該死!這真是太糟了。感謝您的警告。 – salvo