Я просматриваю вложенные словари и получаю все значения в другом списке. Я уже создал код, который выполняет эту работу. Но мне нужно, чтобы он был более эффективным. Кто-нибудь знает более действенный способ?

Код:

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

Заранее спасибо.

1
Rachit kapadia 21 Сен 2018 в 12:07

2 ответа

Лучший ответ

Я думаю, что изменил свой ответ и успешно создал код более общим способом. Как я уже сказал, пара "ключ-значение" (например, Start, Decision Action, Stop) списка словарей может быть существуют или не могут быть, а также есть вероятность добавления новых вложенных словарей, таких как этот, поэтому это не может быть сделано как статическое. В любом случае вот общий код:

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]}
1
Rachit kapadia 22 Сен 2018 в 03:49

Вы можете использовать понимание списка:

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
Sociopath 21 Сен 2018 в 09:22