繁体   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