У меня есть словарь словарей, как этот небольшой пример:
маленький пример:
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
но результаты этого кода не то, что я хочу. ты знаешь как это исправить?
Вам нужно обработать внутренние словари, не изменяя ключей большого. Передайте частоту в функцию:
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()}
Вы можете сделать следующее:
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}}
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
? Детали округления неясны.