2017-01-25 2 views
0

У меня есть file1 имеет информацию об области, как 1-я хромосома человека из положения 1 в положение 10, выглядит следующим образом: chromosome,start_position,end_position 1,1,10 1,11,20 Как добавить все значения ключей и распечатать новый словарь?

file2 имеет значения для каждой позиции, как позиции 6 на 1-я хромосома человека с некоторого значения, выглядит следующим образом: chromosome,position,value 1,1,value1 1,2,value2 1,6,value3 1,13,value4

Я хочу добавить значения в file2 к file1, основываясь на позиции в file2, принадлежит ли к какой-либо области в file1, что-то вроде: chromosome,start_position,end_position,total_value 1,1,10,value1+value2+value3 1,11,20,value4

Оба файла могут быть более 10 м ллиллин строк. Должен ли я сделать это, просматривая каждую строку файла2 (чтобы увидеть, находится ли позиция в любом регионе файла1) или сделать каждую строку файла1 в словаре (затем найти значение в файле2? затем добавьте?)?

И как я могу получить «общее значение» каждой строки в файле1? Спасибо всем!

+0

Добро пожаловать в переполнение стека! Сначала вы можете взять тур (http://stackoverflow.com/tour) и узнать [Как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask) и создать [ Minimal, Complete и Verifiable] (http://stackoverflow.com/help/mcve). Это облегчает нам помощь. –

+0

Этот вопрос не дает понять, как вам нужно комбинировать 'file1' и' file2' –

+0

Мне нравится подход к словарю. Он будет потреблять несколько концертов, но если ваша машина наполовину приличная, это не так уж и важно. Вы сохраните память, если вы можете сохранить ключ как строку, например «1,1,10», вместо того, чтобы разбить ее на кортеж. – tdelaney

ответ

0

Я предполагаю, что вы не обязательно ищете наиболее эффективный код, но тот, который выполняет эту работу?

Я бы прочитал значения в файле 2 в словаре, причем ключ был (chromosome, start) (предполагая, что начало и конец всегда совпадают в файле 2).

Затем прочитайте файл 1 линия за линией, и найти все соответствующие значения в словаре «Файл 2», добавив полученную сумму до конца строки (вероятно, в новом файле):

import numpy as np 

for line in file1: 
    chromosome, start, end = line.split(',') 
    total_value = np.sum([file2_dict.get([(chromosome,str(i))], 0) for i in 
          range(int(start), int(end)+1)]) 
    #do something with the total value, maybe write to another file. 
    #Could do: 
    new_line = ','.join([chromosome, start, end, total_value]) + '\n' 

Я собираюсь оставить остальные детали реализации вам (например, получить словарь из файла 2). Это может быть немного тяжело для использования памяти, но, надеюсь, не так уж плохо.

Обратите внимание на использование метода .get() со словарным поиском - это позволит убедиться, что любая клавиша, которая не найдена в словаре, возвращает 0. Вы решаете, работает ли это для вашей ситуации. Также обратите внимание на использование str и int для преобразования текста и цифр. Вы решаете, подходит ли это на основе вашей реализации.

Кроме того, если вы еще не сталкивались с пониманием списка Python, сделайте некоторое исследование. Именно это позволяет нам написать однострочный экземпляр, чтобы получить сумму всех соответствующих значений.

+0

Спасибо вам за помощь! – kelloggs