迭代包含dict键的列。从第二个字典返回匹配的键,保持第一个字典

时间:2015-10-29 14:29:07

标签: python python-2.7 csv dictionary

我已经使用Python(2.7)堆积了几天的问题。我有来自2个不同群体的2个数据集A和B,包含沿着染色体的有序位置(由名称定义,例如rs4957684)以及它们在2个群体中的相应频率。 B中的大多数位置与A中的位置匹配。我需要在A和B中获得仅在A和B之间匹配的位置以及沿着染色体的相应顺序的频率。

我创建了一个包含4列的csv文件(df.csv):来自A(c1)的键,来自A(c2)的值,来自B(c3)的键,来自B(c4)的值。

首先,我创建了2个dic,dA和dB,分别来自A和B的键和值(位置和频率),并查找A和B之间匹配的键。从匹配的键我生成了2个新的dicts for A和B(dA2和dB2)。 问题在于,由于它们是dicts,我无法得到染色体中匹配位置的顺序,所以我想出了另一种策略:

沿c1迭代,查看c3中的任何键是否与c1中的有序键匹配。如果是,则返回带有匹配键的值(A和B)的有序列表。

我写了这段代码:

import csv
from collections import OrderedDict

with open('df.csv', mode='r') as infile: # input file
# to open the file in universal-newline mode
reader = csv.reader(open('df.csv', 'rU'), quotechar='"', delimiter = ',')
dA= dict((rows[1],rows[2]) for rows in reader)
dB= dict((rows[3],rows[4]) for rows in reader)

import sys  
sys.stdout = open("df2.csv", "w") 

for key, value in dB:
    if rows[3] in dA.key():
        print rows[2], rows[4]

这里脚本似乎运行但我没有输出

# I also tried this:
for row in reader:
    if row[3] in dA.key():
        print row[4]

......我也有同样的问题。

1 个答案:

答案 0 :(得分:1)

如我所见,您导入了OrderedDict,但没有使用它。您应该构建OrderedDict以保存密钥顺序:

dict_a = OrderedDict((rows[1],rows[2]) for rows in reader)
dict_b = dict((rows[3],rows[4]) for rows in reader)

for key, value in dict_a.iteritems():
    if dict_b[key] == value:
        print value