2014-02-19 73 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