如何使用占位符动态更新defaultdict

时间:2015-01-31 02:19:46

标签: python dictionary

我在向键添加值时尝试动态更新字典时遇到问题。

下面的代码主要用于遍历子目录,然后循环遍历每个子目录中的文件。然后简单地解析每个文件并将数据添加到defaultdict字典中。数据由两个字段组成:chrLocation(键)和editRatio(值)。我在这里要完成的是适应那些最初没有从第一个文件添加的密钥。请注意,每个文件中的键都是唯一的,但其他文件中可能存在重复项。同样,可能会出现键,例如file7不在前6个文件中。我想在第一个键入前有6个占位符(零)在我的字典中显示这个。

dataDict = defaultdict(list)
for root, dirs, filenames in os.walk(rootdir + "/out/"):
    for d in dirs:
        print "Processing: ", d
        colNames.append(d + "_" + sampOriginDict[d])
            for editingFile in os.listdir(rootdir + "/out/" + d):
                eFile = open(rootdir + "/out/" + d + "/" + editingFile, 'r')
                for line in eFile:
                    # only care about 3 fields (chromosome, location and editratio)
                    chromosome, location, x1, x2, x3, x4, editRatio, x5, x6, x7 = line.split("\t")
                    chrLocation = chromosome + "_" + location
                    dataDict[chrLocation].append(editRatio)

下面显示了简短的输出,用于循环显示2个文件:

chr17_37916827 ['0.15']
chr16_29681751 ['0.1']
chr6_150045787 ['0.33']
chr10_75538108 ['0.43', '0.71']
chr15_64447436 ['0.5', '0.5']
chr16_15794023 ['0.21', '0.18']

截至目前,该代码不适用于占位符。因此,通过查看输出,我不确定'0.15'是来自第一个文件还是第二个文件。

非常感谢任何帮助。谢谢

编辑:我添加了一个条件来检查一个密钥是否已经存在,这是结果输出:

chr17_37916827 ['File2']
chr16_29681751 ['File1']
chr6_150045787 ['File2']
chr10_75538108 ['File1', 'exists']
chr15_64447436 ['File1', 'exists']
chr16_15794023 ['File1', 'exists']

代码:

if chrLocation in dataDict.keys(): 
    dataDict[chrLocation].append("exists")
else:
    dataDict[chrLocation].append(d)

我想实现输出:

chr17_37916827 ['0', 'File2']
chr16_29681751 ['File1', '0']
chr6_150045787 ['0', 'File2']
chr10_75538108 ['File1', 'exists']
chr15_64447436 ['File1', 'exists']
chr16_15794023 ['File1', 'exists']

1 个答案:

答案 0 :(得分:0)

使用您当前的方法执行此操作的方法

好的,你要么在开始时知道有多少文件,要么按索引更改每个列表中的值,要么保持计数,然后遍历defaultdict并将占位符值附加到该计数以下的任何值。

前者的例子:

d = defaultdict(lambda: [0] * 7)

然后是当前的i

dataDict[chrLocation][i] = editRatio

但我不建议这样做,因为保持这些占位符不变是不必要的。


以不同的方式完成相同的目标

除非我误解,否则目标只是能够分辨哪些文件具有给定密钥。也许使用像

这样的结构
dataDict = defaultdict(dict)

和你在做dataDict[chrLocation].append(editRatio)而不是做,

dataDict[chrLocation][editingFile] = editRatio

然后,您可以检查是否有位置和文件的值,

try:
    print(dataDict['chr10_75538108']['File1'])
except KeyError:
    print('Nope!')

如果您不打算使用位置和文件进行查找,只需将(editingFile, editRatio)的元组附加到列表中。