Как я могу объединить отдельные выходные данные словаря из функции в один словарь?

Для нашего проекта Python нам нужно решить несколько вопросов. Однако мы застряли на этом:

«Напишите функцию, которая по имени файла FASTA возвращает словарь с идентификаторами последовательностей в качестве ключей и кортежем в качестве значения. Значение обозначает минимальную и максимальную молекулярную массу последовательности (последовательности могут быть неоднозначными)».

import collections
    from Bio import Seq
    from itertools import product
    def ListMW(file_name):
        seq_records = SeqIO.parse(file_name, 'fasta',alphabet=generic_dna)
        for record in seq_records:
            dictionary = Seq.IUPAC.IUPACData.ambiguous_dna_values
            result = []
            for i in product(*[dictionary[j] for j in record]):
                result.append("".join(i))
                molw = []
            for sequence in result:
                molw.append(SeqUtils.molecular_weight(sequence))
            tuple= (min(molw),max(molw))
            if min(molw)==max(molw):
                dict={record.id:molw}
            else:
                dict={record.id:(min(molw), max(molw))}

            print(dict) 

Используя этот код, нам удается получить такой вывод:

{'seq_7009': (6236.9764, 6367.049999999999)}
{'seq_418': (3716.3642000000004, 3796.4124000000006)}
{'seq_9143_unamb': [4631.958999999999]}
{'seq_2888': (5219.3359, 5365.4089)}
{'seq_1101': (4287.7417, 4422.8254)}
{'seq_107': (5825.695099999999, 5972.8073)}
{'seq_6946': (5179.3118, 5364.420900000001)}
{'seq_6162': (5531.503199999999, 5645.577399999999)}
{'seq_504': (4556.920899999999, 4631.959)}
{'seq_3535': (3396.1715999999997, 3446.1969999999997)}
{'seq_4077': (4551.9108, 4754.0073)}
{'seq_1626_unamb': [3724.3894999999998]}

Как видите, это не один словарь, а несколько словарей друг под другом. Итак, мы можем изменить наш код или ввести дополнительную команду, чтобы получить его в этом формате:

{'seq_7009': (6236.9764, 6367.049999999999),
'seq_418': (3716.3642000000004, 3796.4124000000006),
'seq_9143_unamb': (4631.958999999999),
'seq_2888': (5219.3359, 5365.4089),
'seq_1101': (4287.7417, 4422.8254),
'seq_107': (5825.695099999999, 5972.8073),
'seq_6946': (5179.3118, 5364.420900000001),
'seq_6162': (5531.503199999999, 5645.577399999999),
'seq_504': (4556.920899999999, 4631.959),
'seq_3535': (3396.1715999999997, 3446.1969999999997),
'seq_4077': (4551.9108, 4754.0073),
'seq_1626_unamb': (3724.3894999999998)}

Или каким-то образом удалось прояснить, что он должен использовать ключ seq_ID и молекулярный вес в качестве значения для одного словаря?


person Reetveter 199    schedule 20.12.2017    source источник
comment
Возможно, вам придется использовать update   -  person Bharath    schedule 20.12.2017


Ответы (2)


Установите словарь прямо перед циклом for, а затем обновите его во время цикла, например:

import collections
    from Bio import Seq
    from itertools import product
    def ListMW(file_name):
        seq_records = SeqIO.parse(file_name, 'fasta',alphabet=generic_dna)
        retDict = {}
        for record in seq_records:
            dictionary = Seq.IUPAC.IUPACData.ambiguous_dna_values
            result = []
            for i in product(*[dictionary[j] for j in record]):
                result.append("".join(i))
                molw = []
            for sequence in result:
                molw.append(SeqUtils.molecular_weight(sequence))
            tuple= (min(molw),max(molw))
            if min(molw)==max(molw):
                retDict[record.id] = molw
            else:
                retDict[record.id] = (min(molw), max(molw))}
            # instead of printing now, print in the end of your function / script
            # print(dict) 

Прямо сейчас вы устанавливаете новый словарь на каждом этапе цикла и печатаете его. Это просто нормальное поведение вашего кода, чтобы печатать много-много dict.

person IMCoins    schedule 20.12.2017
comment
Спасибо, это сработало! мы получили почти то, что нам нужно :) - person Reetveter 199; 20.12.2017
comment
Добро пожаловать, но @Jean-François Fabre также заслуживает вашего голоса. Он также дал подсказку, как оптимизировать код. - person IMCoins; 20.12.2017
comment
Да, действительно, я пытаюсь поставить лайк этому и вашему, но у меня не получается, потому что я новый пользователь... - person Reetveter 199; 21.12.2017

вы создаете словарь с 1 записью на каждой итерации.

Вы хотите:

  • определите переменную dict (лучше использовать dct, чтобы избежать повторного использования имени встроенного типа) перед вашим циклом
  • переписать присваивание на dict в цикле

Итак, перед циклом:

dct = {}

и в цикле (вместо вашего кода if + dict =) в троичном выражении, где min и max вычисляются только один раз:

minval = min(molw)
maxval = max(molw)
dct[record.id] = molw if minval == maxval else (minval,maxval)
person Jean-François Fabre    schedule 20.12.2017