изменить словарь словарей в Python

1

У меня есть словарь словарей, как этот небольшой пример:

маленький пример:

dict = {1: {'A': 8520, 'C': 5772, 'T': 7610, 'G': 5518}, 2: {'A': 8900, 'C': 6155, 'T': 6860, 'G': 5505}}

Я хочу составить другой словарь словарей, в котором вместо абсолютных чисел у меня была бы частота каждого числа в каждом под-словаре. например, для 1-го внутреннего словаря у меня будет следующий под-словарь:

1: {'A': 31.25, 'C': 21, 'T': 27.75, 'G': 20}

вот ожидаемый результат:

dict2 = {1: {'A': 31.25, 'C': 21, 'T': 27.75, 'G': 20}, 2: {'A': 32.5, 'C': 22.50, 'T': 25, 'G': 20}}

Я пытаюсь сделать это в Python с помощью следующей команды:

dict2 = {}
for item in  dict.items():
    freq = item.items/sum(item.items())
    dict2[] = freq

но результаты этого кода не то, что я хочу. ты знаешь как это исправить?

  • 0
    item.item - это встроенный метод, в котором item.items() является представлением dict_items , ни одно из которых не может быть использовано dict_items по себе. Первый должен быть вызван ( item.items() ), а второй должен быть повторен (как вы сделали с циклом for). Также использование dict в качестве имени переменной не рекомендуется, так как оно скрывает встроенное ключевое слово dict используемое для создания объектов словаря. Попробуйте использовать dct или my_dict вместо этого. Кроме того, как вы попали на «частоты» в вашем ожидаемом выходе? например, для 1 почему 'A': 31.25 не 31 , а 'G': 20 не 20.25 ? Детали округления неясны.
Теги:
dictionary
python-2.7

2 ответа

4
Лучший ответ

Вам нужно обработать внутренние словари, не изменяя ключей большого. Передайте частоту в функцию:

def get_frequency(d):
    total = sum(d.values())
    return {key: value / total * 100 for key, value in d.items()}

Затем используйте понимание слова, чтобы применить функцию ко всем своим словарям:

dict2 = {key: get_frequency(value) for key, value in dict1.items()}

Обратите внимание, что я добавил * 100, из вашего вывода видно, что вы ищете проценты от 0-100 до 0-100 а не число с float от 0-1.

Редактировать:

Если вы используете python2 / является целочисленным делением, добавьте число с float примерно так:

return {key: float(value) / total * 100 for key, value in d.items()}
  • 0
    все частоты 0
  • 0
    Вы на Python2?
Показать ещё 4 комментария
2

Вы можете сделать следующее:

dct = {1: {'A': 8520, 'C': 5772, 'T': 7610, 'G': 5518}, 2: {'A': 8900, 'C': 6155, 'T': 6860, 'G': 5505}}

result = {}
for key, d in dct.items():
    total = sum(d.values())
    result[key] = {k : a / total for k, a in d.items()}

print(result)

Выход

{1: {'C': 0.21050328227571116, 'T': 0.2775346462436178, 'G': 0.2012399708242159, 'A': 0.31072210065645517}, 2: {'C': 0.22447118891320203, 'T': 0.25018234865062, 'G': 0.20076586433260393, 'A': 0.32458059810357404}}
  • 0
    все частоты 0
  • 0
    Что вы имеете в виду, что все частоты равны 0?
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню