2015-10-29 2 views
1

Я столкнулся с проблемой в течение пары дней с Python (2.7). У меня есть 2 набора данных, A и B, из 2 разных популяций, содержащих упорядоченные положения вдоль хромосом (определенные по имени, например rs4957684) и их соответствующие частоты в двух популяциях. Большинство позиций в B соответствуют значениям в A. Мне нужно получить частоты в A и B только тех позиций, которые соответствуют A и B, и в соответствующем порядке вдоль хромосом.Итерация над столбцом, содержащим ключи от dict. Возвращаемые сопоставленные ключи из второго dict, сохраняющие порядок ключей от первого dict

Я создал файл csv (df.csv) с 4 столбцами: ключи от A (c1), значения от A (c2), ключи от B (c3), значения от B (c4).

Сначала я создал 2 dicts, dA и dB, с ключами и значениями (положениями и частотами соответственно) от A и B и искал ключи, совпадающие между A и B. Из сопоставленных ключей я сгенерировал 2 новых dicts для 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] 

... и у меня такая же проблема.

+0

Почему вы не пользуетесь OrderedDict? –

+0

Также обратите внимание, что вы не можете перебирать словарь следующим образом: 'для ключа, значение в дБ', вы должны вызывать метод' iteritems', если вам нужны как ключ, так и значение. –

ответ

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 
+0

Большое спасибо @ Юджин Солдатов !!. Это здорово! – Lucas

Смежные вопросы