【问题标题】:Iterate over a column containing keys from a dict. Return matched keys from second dict keeping order of keys from first dict迭代包含来自字典的键的列。从第二个字典返回匹配的键,保持第一个字典的键顺序
【发布时间】: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


【解决方案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

【讨论】:

  • 非常感谢@Eugene Soldatov !!效果很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
相关资源
最近更新 更多