簡體   English   中英

如何從單個字典創建嵌套字典?

[英]How to create a nested dictionary from a single dictionary?

我正在為我的問題尋找一個很好的 pythonic 解決方案。 我有一本字典,如:

char_dist = {'b' : 0.345, 'd' : 0.158, 'c' : 0.059, 'w' : 0.437}

我想得到一些這樣的:

new_dict = {'b': {'b': 0.11902,
                  'd': 0.05451,
                  'c': 0.020355,
                  'w': 0.150765},
            'd': {'b': 0.054501,
                  'd': 0.024964,
                  'c': 0.009322,
                  'w': 0.150765},
            'c': {'b': 0.020355,
                  'd': 0.009322,
                  'c': 0.003481,
                  'w': 0.025783},
            'w': {'b': 0.150765,
                  'd': 0.069046,
                  'c': 0.025783,
                  'w': 0.190969}}

新字典是將舊字典中的值相乘的結果。

new_dict = {char_dist[key] : {char_dist[key1]: char_dist[key1][value] * char_dist[key2][value], etc...

PS我嘗試了一些這樣的,但仍然弄清楚:

new = defaultdict(dict)

for base, val in char_distribution.items():
    new[base] = {base: p for base, p in
                     zip('bdcw', char_dist)}


pprint(matrix)

但是我對所有嵌套字典都得到了相同的值:

defaultdict(<class 'dict'>,
            {'b': {'b': 0.11902,
              'd': 0.05451,
              'c': 0.020355,
              'w': 0.150765},
             'c': {'b': 0.11902,
              'd': 0.05451,
              'c': 0.020355,
              'w': 0.150765}
            'd': {'b': 0.11902,
              'd': 0.05451,
              'c': 0.020355,
              'w': 0.150765}
             'w': {'b': 0.11902,
              'd': 0.05451,
              'c': 0.020355,
              'w': 0.150765}})

我想創建一種過渡矩陣。

您可以使用嵌套的字典理解來做到這一點:

expected = {kk: {k: vv*v for k, v in char_dist.items()} for kk, vv in char_dist.items()}

print(expected)
[out]:
{'b': {'b': 0.11902, 'c': 0.02035, 'd': 0.05451, 'w': 0.15076},
 'c': {'b': 0.02035, 'c': 0.00348, 'd': 0.00932, 'w': 0.02578},
 'd': {'b': 0.05451, 'c': 0.00932, 'd': 0.02496, 'w': 0.06905},
 'w': {'b': 0.15076, 'c': 0.02578, 'd': 0.06905, 'w': 0.19097}}

我想如果你正在處理分布,一些線性代數不會受到傷害。 認識熊貓:

import pandas as pd
....
df = pd.DataFrame([char_dist])
df.T.dot(df)                                                                                       

輸出:

          b         d         c         w
b  0.119025  0.054510  0.020355  0.150765
d  0.054510  0.024964  0.009322  0.069046
c  0.020355  0.009322  0.003481  0.025783
w  0.150765  0.069046  0.025783  0.190969

我覺得最簡單:

char_dist = {'b': 0.345, 'd': 0.158, 'c': 0.059, 'w': 0.437}
old_dict = {'b': 0.68746258423, 'd': 0.5429823052, 'c': 0.5849805243, 'w': 0.95840285}

new_dict = dict.fromkeys(char_dist, old_dict)

print(new_dict)

想出了這樣的東西。

base_distribution = {'A' : 0.345, 'C' : 0.158, 'G' : 0.059, 'T' : 0.437}

markov = defaultdict()
for base, val in base_distribution.items():
    markov[base] = markov.get(base, {})
    for key, val in base_distribution.items():
        p = round(base_distribution[base] * base_distribution[key], 4)
        markov[base][key] = markov[base].get(key, p)
pprint(markov)

defaultdict(None,
            {'A': {'A': 0.119, 'C': 0.0545, 'G': 0.0204, 'T': 0.1508},
             'C': {'A': 0.0545, 'C': 0.025, 'G': 0.0093, 'T': 0.069},
             'G': {'A': 0.0204, 'C': 0.0093, 'G': 0.0035, 'T': 0.0258},
             'T': {'A': 0.1508, 'C': 0.069, 'G': 0.0258, 'T': 0.191}})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM