从丽丝那儿拿一份口述

2024-05-07 23:42:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我从数据库中提取了一些列表:

print(liste)
[('VEST', 'MODEL-1', 'BEIGE', 'M'), 
 ('VEST', 'MODEL-1', 'BEIGE', 'S'), 
 ('JACKET', 'MOD-1', 'GREEN', 'S'), 
 ('JACKET', 'MOD-1', 'GREEN', 'M'), 
 ('JACKET', 'MOD-2', 'BLACK', 'L'), 
 ('JACKET', 'MOD-2', 'BLACK', 'XL')]

现在我需要创建一个这样的dict:

mydict = {'VEST' : {'MODEL-1' : {'BEIGE' : ('S', 'M')}},
          'JACKET' : ({'MOD-1' : {'GREEN' : ('S', 'M')}},
                      {'MOD-2' : {'BLACK' : ('L', 'XL')}})}

我将在类似json的tkinter中使用它。我需要选择这样的东西:

print(mydict['JACKET'][1]['MOD-2']['BLACK'][0])
L
# Or
print(mydict['VEST']['MODEL-1']['BEIGE'][0])
S

如何创建dict?我厌倦了尝试不同的方法。如果我能得到好的建议,我会很高兴的


Tags: mod数据库json列表modelgreendictmydict
2条回答

您可以尝试@LevLevitsky演示的defaultdict,也可以尝试这种可行但复杂的方法:

result = {}
for i in liste:
    if i[0] not in result.keys():
            result[i[0]] = {i[1]: {i[2]: tuple(i[3:4])}}
    else:
            if i[1] not in result[i[0]].keys():
                   result[i[0]][i[1]] = {i[2]: tuple(i[3:4])}
            else:
                   if i[2] not in result[i[0]][i[1]].keys():
                            result[i[0]][i[1]][i[2]] = tuple(i[3:4])
                   else:
                            result[i[0]][i[1]][i[2]]+=tuple(i[3:4])

print result #{'JACKET': {'MOD-2': {'BLACK': ('L', 'XL')}, 'MOD-1': {'GREEN': ('S', 'M')}}, 'VEST': {'MODEL-1': {'BEIGE': ('M', 'S')}}}

您所展示的内容不太一致,但我认为您可能会从使用^{}中受益:

In [1]: from collections import defaultdict

In [2]: liste = [('VEST', 'MODEL-1', 'BEIGE', 'M'), 
   ...:  ('VEST', 'MODEL-1', 'BEIGE', 'S'), 
   ...:  ('JACKET', 'MOD-1', 'GREEN', 'S'), 
   ...:  ('JACKET', 'MOD-1', 'GREEN', 'M'), 
   ...:  ('JACKET', 'MOD-2', 'BLACK', 'L'), 
   ...:  ('JACKET', 'MOD-2', 'BLACK', 'XL')]

In [3]: mydict = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))

In [4]: for kind, model, color, size in liste:
   ...:     mydict[kind][model][color].append(size)
   ...:     

In [5]: mydict['VEST']['MODEL-1']['BEIGE']
Out[5]: ['M', 'S']

defaultdict构造函数以“factory”函数作为参数,即不带参数调用的可调用函数来替换缺少的值。例如,defaultdict(list)在您尝试访问它时,它将为每个丢失的键提供一个空列表。你知道吗

在本例中,我创建了一个嵌套的defaultdict对象,它为每个键创建另一个defaultdict。内部的还创建了一个defaultdict,它还使用defaultdict作为工厂。这反映了您的数据层次结构,并为丢失的键保存了多个检查或异常处理。你知道吗

相关问题 更多 >