更有效地从嵌套字典中获取内容

时间:2018-09-21 09:07:14

标签: python-3.x dictionary

我正在遍历嵌套字典并获取不同列表中的所有值。我已经创建了完成这项工作的代码。但是我需要提高效率。有谁知道更有效的方法?

代码:

import collections

dict = {
    0.5: {u'Start': 0.0, u'Decision Logic#3': 5.0, u'Stop': 0.0, u'Decision Action#1': 5.0, u'Field Level DQ': 120.0},
    1.0: {u'Start': 0.0, u'Decision Logic#3': 5.0, u'Stop': 0.0, u'Decision Action#1': 5.0, u'Field Level DQ': 115.0},
    2.0: {u'Start': 0.0, u'Decision Logic#3': 5.0, u'Stop': 0.0, u'Decision Action#1': 5.0, u'Field Level DQ': 120.0},
    4.0: {u'Start': 0.0, u'Decision Logic#3': 5.0, u'Stop': 0.0, u'Decision Action#1': 5.0, u'Field Level DQ': 120.0},
    32.0: {u'Start': 3.0, u'Decision Logic#3': 5.0, u'Stop': 0.0, u'Decision Action#1': 5.0, u'Field Level DQ': 120.0},
    8.0: {u'Start': 0.0, u'Decision Logic#3': 5.0, u'Stop': 0.0, u'Decision Action#1': 5.0, u'Field Level DQ': 115.0},
    64.0: {u'Start': 2.0, u'Decision Logic#3': 5.0, u'Stop': 0.0, u'Decision Action#1': 5.0, u'Field Level DQ': 123.0},
    128.0: {u'Start': 5.0, u'Decision Logic#3': 5.0, u'Stop': 0.0, u'Decision Action#1': 5.0, u'Field Level DQ': 122.0},
    256.0: {u'Start': 3.0, u'Decision Logic#3': 5.0, u'Stop': 0.0, u'Decision Action#1': 5.0, u'Field Level DQ': 121.0},
    16.0: {u'Start': 0.0, u'Decision Logic#3': 5.0, u'Stop': 0.0, u'Decision Action#1': 5.0, u'Field Level DQ': 120.0}
    64.0: {u'Watermark': 100.0, u'Decision Action#1': 5.0, u'Stop': 0.0,
       u'Decision Logic#3': 5.0, u'Start': 5.0,
       u'Token Maskin Action#1': 425.0,
       u'Field Level DQ': 122.0}
    }

dict = collections.OrderedDict(sorted(dict.items()))

list_start, decision_logic, stop, decision_action, field_dq = [], [], [], [], []

for main_key, main_val in dict.items():
    if "Start" in main_val:
        list_start.append(main_val['Start'])
    if "Decision Logic#3" in main_val:
        decision_logic.append(main_val['Decision Logic#3'])
    if "Stop" in main_val:
        stop.append(main_val['Stop'])
    if "Decision Action#1" in main_val:
        decision_action.append(main_val['Decision Action#1'])
    if "Field Level DQ" in main_val:
        field_dq.append(main_val['Field Level DQ'])

print(list_start)
print(decision_logic)
print(stop)
print(decision_action)
print(field_dq)

我想要的输出就像它应该自动创建一个列表(一般来说是精确的),如果我以这种方式在嵌套字典中添加更多键:

{
    'list_start' : [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 2.0, 5.0, 3.0]
    'decision_logic' : [5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0]
    'stop' : [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
    'decision_action' : [5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0]
    'field_dq' : [120.0, 115.0, 120.0, 120.0, 115.0, 120.0, 120.0, 123.0, 122.0, 121.0]
}

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用列表理解:

import collections
dict1 = collections.OrderedDict(sorted(dict.items()))

list_start  = [j['Start'] for i,j in dict1.items()]
decision_logic = [j['Decision Logic#3'] for i,j in dict1.items()]
stop = [j['Stop'] for i,j in dict1.items()]
decision_action = [j['Decision Action#1'] for i,j in dict1.items()]
field_dq = [j['Field Level DQ'] for i,j in dict1.items()]

# Output
# list start = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 2.0, 5.0, 3.0]
# decision_logic = [5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0]
# stop = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
# decision_action = [5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0]
# field_dq = [120.0, 115.0, 120.0, 120.0, 115.0, 120.0, 120.0, 123.0, 122.0, 121.0]

答案 1 :(得分:1)

我认为我修改了答案,并以更通用的方式成功创建了代码。正如我所说的列表中的键值对(例如StartDecision ActionStop)字典可以存在也可以不存在,并且有可能添加这样的新嵌套字典,因此不能将其设置为静态。无论如何,这是通用代码:

dict = collections.OrderedDict(sorted(dict.items()))
get_total_list = []
for i, j in dict.items():
    for item in j:
        get_total_list.append(item) if item not in get_total_list else None

print("Total Legends :", get_total_list)
main_list = {}
for item in get_total_list:
    sublist = []
    for i, j in dict.items():
        if item in j:
            sublist.append(j[item])
    main_list[item] = sublist
print(main_list)

# # Output:
{u'Watermark': [100.0],
 u'Decision Action#1': [5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0],
 u'Decision Logic#3': [5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0],
 u'Stop': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
 u'Start': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 5.0, 5.0, 3.0],
 u'Token Maskin Action#1': [425.0],
 u'Field Level DQ': [120.0, 115.0, 120.0, 120.0, 115.0, 120.0, 120.0, 122.0,
                     122.0, 121.0]}