Python - уникальные (!) Словарные ключи

1

У меня есть данные, поступающие с машины (через pexpect), и я анализирую ее с помощью регулярных выражений в словарь, подобный этому

for line in stream:
    if '/' in line:
        # some matching etc which results in getting the
        # machine name, an interface and the data for that interface
        key=str(hostname)+":"+r.groups()[0][0:2]+r.groups()[2]
        dict[key]=str(line[3])

И все работает нормально, я получаю много строк, как это, когда я читаю его

machine1:fe0 <data>  

<data> - одна строка или целое число

Теперь я понимаю, что для интерфейса могут существовать несколько данных, и кажется, что в этом случае я переписываю значение для ключа каждый раз, когда сталкиваюсь с ним. Я хотел бы сделать ключ уникальным в том, что подчеркивает тот факт, что для этого интерфейса существует несколько информации. Например. если fe0 имеет 3 экземпляра или fe1 имеет 4

machine1:fe0:3 <data> <data> <data>
machine1:fe1:4 <data> <data> <data> <data>

С этой целью я не возражаю, если один экземпляр имеет 1 после того, как он мне это скажет.
надеюсь, что это ясно, и кто-то может указать мне в правильном направлении - большое спасибо

  • 0
    Нужная вам структура данных - это мультикарта, а defaultdict (список), как показано ниже, является обычной реализацией.
Теги:
dictionary

2 ответа

4
Лучший ответ

Вы можете создать список для каждого ключа, удерживая все значения для этого ключа:

d = collections.defaultdict(list)
for line in stream:
    if '/' in line:
        #.....
        key =  str(hostname)+":"+r.groups()[0][0:2]+r.groups()[2]
        value = str(line[3])
        d[key].append(value)

Изменить: Если вы хотите, чтобы ключи/значения были точно такими же, как указано в вашем вопросе, вы можете сделать что-то вроде:

d2 = {}
for key,values in d.iteritems():
    d2['%s:%d' % (key, len(values)] = ' '.join(str(v) for v in values)

Я использовал ' '.join() здесь, чтобы объединить значения в одну строку - это не совсем ясно из вашего вопроса, если это то, что вы хотите.

Я не рекомендую так поступать, так как это затруднит доступ к отдельным значениям.

  • 0
    Я думаю, что это чище, чем то, что я сделал, но это меняет тип вещей, хранящихся в словаре, что может потребовать изменения других частей программы, чтобы приспособиться к нему.
  • 0
    Я добавил способ, которым вы можете делать именно то, что вы просили, хотя я не уверен, как вы хотите, чтобы значения хранились.
Показать ещё 9 комментариев
0
for (lineno, line) in enumerate(stream):
    if '/' in line:
        # some matching etc which results in getting the
        # machine name, an interface and the data for that interface
        key=str(hostname)+":"+r.groups()[0][0:2]+r.groups()[2]
        dict[key + ":" + lineno]=str(line[3])

Вы не закончите с этим гладко увеличивая этот путь, но каждый словарь будет уникальным, а числа, связанные с каждой парой хостов и интерфейсов, будут увеличиваться. Вы можете сделать клавиши лексически сортируемыми, изменив последнюю строку на dict[key + ":" + ('%06d' % (lineno,))=str(line[3])

  • 0
    Это работает нормально, хотя и не подсчитывает количество экземпляров, но дает несколько строк, которые легко обнаружить, отсортировав их в Excel (нужно перейти к другим). Я пытаюсь заставить других работать, чтобы попробовать это тоже

Ещё вопросы

Сообщество Overcoder
Наверх
Меню