簡體   English   中英

從列表創建嵌套字典

[英]Creating a nested dictionary from a list

我有一個Final_Bioteck列表,其前5個Final_Bioteck看起來像這樣:

['PBYI', 'DRRX', 'FBIO', 'CAPR', 'KDMN']

我正在嘗試創建一個嵌套的字典,第一層是字母,第二層是上述列表中的元素。 我正在嘗試創建索引字典。

我嘗試使用以下代碼進行操作:

from string import ascii_uppercase

Bioteck_dict ={}
for letter in ascii_uppercase:
    for stock in Final_Bioteck:
        if stock.startswith(letter):
            try:
                Bioteck_dict[letter].update(stock)
            except KeyError:
                Bioteck_dict[letter] = stock

但是,出現以下錯誤:

'str' object has no attribute 'update'

所需的輸出是這樣的:

Bioteck_dict

{A:
B:
C: 'CAPR':{}
D:  'DRRX':{}
E:
F:

甚至這個:

 {A:
    B:
    C: 'CAPR'
    D:  'DRRX'
    E:
    F:   'FBIO':


              }

.update()是用於.update()的方法,您可以在字符串上調用它。 這是一種執行您想要的操作的方法:

Final_Bioteck = ['PBYI', 'DRRX', 'FBIO', 'CAPR', 'KDMN']
Bioteck_dict = {}
for stock in Final_Bioteck:
    Bioteck_dict.setdefault(stock[0], {})[stock] = {}

在對問題進行更新之后,您似乎希望將沒有關聯庫存的信件在dict明確表示為空容器。 這是值得懷疑是否真的需要(大多數事情,你會隨后想做將只涉及迭代什么在dict ),但你可以在以下兩種方式之一是效果:

等等:

Final_Bioteck = ['PBYI', 'DRRX', 'FBIO', 'CAPR', 'KDMN']
from collections import defaultdict
Bioteck_dict = defaultdict(dict)   # now you can look up any letter (or any key at all) and receive the empty dict, even if there was no entry there before
for stock in Final_Bioteck:
    Bioteck_dict[stock[0]][stock] = {}

要么:

Final_Bioteck = ['PBYI', 'DRRX', 'FBIO', 'CAPR', 'KDMN']
Bioteck_dict = {letter:{} for letter in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'}
for stock in Final_Bioteck:
    Bioteck_dict[stock[0]][stock] = {}

問題是您要將每個字典值分配為字符串,而不是字典。 它需要作為命令開始,以便您可以對其進行更新。 'FBIO'.update(blah)沒有意義。 此外,您可能想要列表的字典,而不是字典的字典-關鍵是什么?

from collections import defaultdict

Bioteck_dict = defaultdict(list)  # Or `set`, if unique and unordered.
for stock in Final_Bioteck:
    Bioteck_dict[stock[0]].append(stock)

結果是:

{'C': ['CAPR'], 'D': ['DRRX'], 'F': ['FBIO'], 'K': ['KDMN'], 'P': ['PBYI']}

這有點類似於您的邏輯:

from string import ascii_uppercase

stocks = ['PBYI', 'DRRX', 'FBIO', 'CAPR', 'KDMN']
d = {}
for letter in ascii_uppercase:
    d[letter] = {}
    for stock in stocks:
        if stock.startswith(letter):
            d[letter][stock] = {}

print d

返回:

{'A': {}, 'C': {'CAPR': {}}, 'B': {}, 'E': {}, 'D': {'DRRX': {}}, 'G': {}, 'F': {'FBIO': {}}, 'I': {}, 'H': {}, 'K': {'KDMN': {}}, 'J': {}, 'M': {}, 'L': {}, 'O': {}, 'N': {}, 'Q': {}, 'P': {'PBYI': {}}, 'S': {}, 'R': {}, 'U': {}, 'T': {}, 'W': {}, 'V': {}, 'Y': {}, 'X': {}, 'Z': {}}

如果有唯一記錄,則使用dict理解。

l = ['PBYI', 'DRRX', 'FBIO', 'CAPR', 'KDMN']
d = { i[0]:i for i in l}
pprint(d)

輸出:

{'C': 'CAPR', 'D': 'DRRX', 'F': 'FBIO', 'K': 'KDMN', 'P': 'PBYI'}

如果有多個記錄,請使用defaultdict。

l = ['PBYI', 'DRRX', 'FBIO', 'CAPR', 'KDMN', 'DUMMY','CAT','COLD']
from collections import defaultdict
d = defaultdict(list)
for i in l:
    d[i[0]].append(i)
pprint(d)

輸出:

defaultdict(<class 'list'>,
            {'C': ['CAPR', 'CAT', 'COLD'],
             'D': ['DRRX', 'DUMMY'],
             'F': ['FBIO'],
             'K': ['KDMN'],
             'P': ['PBYI']})

暫無
暫無

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

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