创建词典列表

时间:2014-02-19 19:56:06

标签: python

我有代码生成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

有人知道为什么更优雅的代码不起作用。

2 个答案:

答案 0 :(得分:6)

由于您在列表推导中使用了x,因此当您到达while循环时它将不再为零 - 而是len(files)-1。我建议将您使用的变量更改为其他内容。传统的做法是使用单个下划线表示您不关心的值。

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

完全取消使用x可能很有用。 python中的习惯是直接迭代序列中的对象,而不是使用计数器变量。您可以执行以下操作:

for tegDic in tegDics:
    #do stuff with tegDic here

虽然在您的情况下稍微有些棘手,但由于您希望同时迭代tegDicsfiles。您可以使用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

答案 1 :(得分:-2)

无论如何,有一种最简单的方式:

taegDics = [{}]*len(files)