迭代包含字典键值的列。从第二个字典返回匹配的键,保持来自第一个字典的键的顺序。

2024-04-25 07:23:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python(2.7)处理一个问题已经有几天了。我有两个数据集,A和B,来自两个不同的群体,包含沿着染色体的有序位置(由一个名字定义,例如rs4957684)和它们在两个群体中的相应频率。B中的大多数位置与A中的位置相匹配。我只需要得到A和B中那些在A和B之间匹配的位置的频率,以及沿着染色体的相应顺序。你知道吗

我创建了一个csv文件(数据框.csv)有4列:来自A(c1)的键、来自A(c2)的值、来自B(c3)的键、来自B(c4)的值。你知道吗

首先,我创建了两个dict,dA和dB,其中包含来自A和B的键和值(分别是位置和频率),并查找在A和B之间匹配的键。根据匹配的键,我为A和B生成了两个新dict(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]

……我也有同样的问题。你知道吗


Tags: csvkeyinimportfordbopendict
1条回答
网友
1楼 · 发布于 2024-04-25 07:23:52

如我所见,您导入了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

相关问题 更多 >