我有代码生成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
有人知道为什么更优雅的代码不起作用。
答案 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
虽然在您的情况下稍微有些棘手,但由于您希望同时迭代tegDics
和files
。您可以使用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)