Python - уникальные (!) Словарные ключи - PullRequest
1 голос
/ 23 января 2010

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

Ответы [ 2 ]

4 голосов
/ 23 января 2010

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

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 голосов
/ 23 января 2010
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])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...