【发布时间】:2015-10-29 14:29:06
【问题描述】:
几天来,我一直在使用 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 个字典,dA 和 dB,分别使用 A 和 B 的键和值(分别为位置和频率),并寻找在 A 和 B 之间匹配的键。从匹配的键中,我生成了 2 个新的字典A 和 B(dA2 和 dB2)。 问题是,由于它们是字典,我无法得到染色体中匹配位置的顺序,所以我想出了另一种策略:
沿 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]
...我也有同样的问题。
【问题讨论】:
-
为什么不使用 OrderedDict?
-
另外请注意,您不能像这样迭代字典:
for key, value in dB,如果您需要键和值,则应调用iteritems方法。
标签: python python-2.7 csv dictionary