Как создать словарь из listinfo? - PullRequest
0 голосов
/ 20 января 2019

Я фильтрую список данных по этому шаблону:

('timestamp', 'node_source', 'node_destination', 'node_source_counter_acces_to_specific_function')

Я пытаюсь извлечь и отобразить данные для node_source '.

import matplotlib.pyplot as plt

list_info= [('1547977394', '02141592cc0000000100000000000000', '02141592cc0000000500000000000000', '1'),
('1547977395', '02141592cc0000000100000000000000', '02141592cc0000000300000000000000', '2'), 
('1547977396', '02141592cc0000000100000000000000', '02141592cc0000000500000000000000', '3'), 
('1547977397', '02141592cc0000000100000000000000', '02141592cc0000000700000000000000', '4'), 
('1547977398', '02141592cc0000000100000000000000', '02141592cc0000000300000000000000', '5'), 
('1547977399', '02141592cc0000000100000000000000', '02141592cc0000000500000000000000', '6'), 
('1547977400', '02141592cc0000000500000000000000', '02141592cc0000000500000000000000', '7'),
('1547977401', '02141592cc0000000500000000000000', '02141592cc0000000500000000000000', '8'),
('1547977402', '02141592cc0000000200000000000000', '02141592cc0000000500000000000000', '9'),
('1547977403', '02141592cc0000000100000000000000', '02141592cc0000000500000000000000', '10'),
('1547977404', '02141592cc0000000200000000000000', '02141592cc0000000300000000000000', '11'),
('1547977405', '02141592cc0000000400000000000000', '02141592cc0000000500000000000000', '12'),
('1547977406', '02141592cc0000000300000000000000', '02141592cc0000000500000000000000', '13'),
('1547977407', '02141592cc0000000400000000000000', '02141592cc0000000500000000000000', '14'),
('1547977408', '02141592cc0000000400000000000000', '02141592cc0000000500000000000000', '15')]

#print(list_info)
for  i, item in enumerate(list_info):
    print(item[1])

dict_node = {}
for timestamp, id_src_node, id_dest_node, Counter in list_info:
        dict_node[id_src_node]["timestamp"].append(float(timestamp))
        dict_node[id_src_node]["Counter"].append(int(Counter))
        dict_node[id_dest_node]["dest"].append(id_dest_node)

print(dict_node)

Но, у меня есть эта ошибка, я могу отобразить информацию об узле источника:

02141592cc0000000100000000000000
    dict_node[id_src_node]["timestamp"].append(float(timestamp))
02141592cc0000000100000000000000
02141592cc0000000100000000000000
02141592cc0000000100000000000000
02141592cc0000000100000000000000
02141592cc0000000100000000000000
02141592cc0000000500000000000000
KeyError: '02141592cc0000000100000000000000'

Например, ожидаемые данные, которые должны быть визуализированы до node_source:02141592cc0000000100000000000000, равны:

('02141592cc0000000100000000000000',timestam':[1547977395,1547977396,1547977397,1547977398,1547977399],'Counter':[2,3,4,5,6],'dest':[02141592cc0000000300000000000000,02141592cc0000000500000000000000,02141592cc0000000700000000000000,02141592cc0000000300000000000000,02141592cc0000000500000000000000])

1 Ответ

0 голосов
/ 20 января 2019

Словари не создают автоматически значения, если они не существуют.

Ваша первая строка кода, изменяющая словарь:

dict_node[id_src_node]["timestamp"].append(float(timestamp))

Это говорит: получить словарь для id_src_node и из этого словаря получите list для 'timestamp', а затем добавьте число к этому списку.

Однако словарь для id_src_node никогда не добавлялся в dict_node, и, конечно, нетсписок был установлен для ключа timestamp в несуществующем словаре.

Хотя есть несколько способов сделать это.Есть dict.setdefault, мне не нравится название или синтаксис, или вы можете создать defaultdict.defaultdict создаст объект определенного типа для ключа, если ключ еще не существует.

Для внешнего словаря необходим словарь по умолчанию, а для внутреннего словаря нужен список по умолчанию:

from collections import defaultdict

def inner_dict():
    return defaultdict(list)

dict_node = defaultdict(inner_dict)

Затем при доступе к новому ключу dict_node добавит inner_dict, который при доступе к внутреннему ключу создаст пустой список, к которому вы можете с радостью добавить:

>>> dict_node['02141592cc0000000100000000000000']['timestamp'].append(1234.5)

Если вы попытаетесь распечатать словари по умолчанию, они не будут такими же аккуратными, как обычный dict.

. Вместо этого используйте обычный dict с dict.setdefault:

dict_node.setdefault(id_src_node, {}).setdefault("timestamp", []).append(float(timestamp))

Как вы можете видеть, это довольно уродливо, но у вас будет dict, который вы хотите.

...