У меня есть данные, поступающие с машины (через 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 после того, как он мне это скажет.
надеюсь, что это ясно, и кто-то может указать мне в правильном направлении - большое спасибо
Вы можете создать список для каждого ключа, удерживая все значения для этого ключа:
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()
здесь, чтобы объединить значения в одну строку - это не совсем ясно из вашего вопроса, если это то, что вы хотите.
Я не рекомендую так поступать, так как это затруднит доступ к отдельным значениям.
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])