从列表创建嵌套字典

时间:2017-05-12 21:15:54

标签: python python-3.x dictionary

我有一个列表Final_Bioteck,其前5个网址如下所示:

['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':


              }

4 个答案:

答案 0 :(得分:2)

.update()是一个dicts的方法,你在字符串上调用它。这是一种做你想要的方式:

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] = {}

OR:

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

答案 1 :(得分:1)

问题在于您将每个dict值分配为字符串,而不是字典。它需要从dict开始,以便您可以更新它。 'FBIO'.update(blah)毫无意义。另外,你可能想要一个列表的词典,而不是一个dicts的词典 - 毕竟键是什么?

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']}

答案 2 :(得分:1)

这个更类似于你的逻辑:

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': {}}

答案 3 :(得分:1)

使用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']})