Уведомления

Группа в Telegram: @pythonsu

#1 Май 31, 2017 12:08:51

timofmax
Зарегистрирован: 2016-05-19
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматирование Списка в читаемый вывод

и так сама задача Сразу каринка

 In [30]: param = '''
   ....: Protocol:
   ....: Prefix:
   ....: AD/Metric:
   ....: Next-Hop:
   ....: Last update:
   ....: Outbound Interface: '''
In [31]: ospf_route = "O        10.0.24.0/24 [110/41] via 10.0.13.3, 3d18h, FastEthernet0/0"
In [32]: 
In [32]: param = param.strip().split()
In [33]: 
In [33]: ospf_route = ospf_route.split()
In [34]: ospf_route.remove('via')
In [35]: 
In [35]: zip(param, ospf_route)
Out[35]: 
[('Protocol:', 'O'),
 ('Prefix:', '10.0.24.0/24'),
 ('AD/Metric:', '[110/41]'),
 ('Next-Hop:', '10.0.13.3,'),
 ('Last', '3d18h,'),
 ('update:', 'FastEthernet0/0')]

Не могу понять как сделать выхлоп с таким выравниванием и без символов

Отредактировано timofmax (Май 31, 2017 12:11:14)

Офлайн

#2 Май 31, 2017 13:34:38

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Форматирование Списка в читаемый вывод

 for i in zip(param, ospf_route):
    print(''.join(i))



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Май 31, 2017 13:39:16

timofmax
Зарегистрирован: 2016-05-19
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматирование Списка в читаемый вывод

ZerG
for i in zip(param, ospf_route):
print(''.join(i))

в ответе отформатировано с отступом.
например можно редактировать строки
 vlan, mac, intf = ['100', 'aabb.cc80.7000', 'Gi0/1']
print "%15s %15s %15s" % (vlan, mac, intf)

Выхлоп:
            100  aabb.cc80.7000           Gi0/1

а у меня получается список. которого может быть не должно быть. и мне надо привести все данные в строку…. но у меня ступр

Офлайн

#4 Май 31, 2017 13:42:29

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Форматирование Списка в читаемый вывод

 print('\n'.join(['{:<15}{}'.format(*item) for item in zip(param, ospf_route)])

Офлайн

#5 Май 31, 2017 14:50:14

timofmax
Зарегистрирован: 2016-05-19
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматирование Списка в читаемый вывод

Stright
print('\n'.join()

 param = '''
Protocol:
Prefix:
AD/Metric:
Next-Hop:
Last update:
Outbound Interface: '''
ospf_route = "O        10.0.24.0/24 [110/41] via 10.0.13.3, 3d18h, FastEthernet0/0"
param = param.strip().split()
ospf_route = ospf_route.split()
ospf_route.remove('via')
print('\n'.join(['{:<15}{}'.format(*item) for item in zip(param, ospf_route)])

Что я делаю не так?
Ваш
 print
не отратывает в моем коде

Офлайн

#6 Май 31, 2017 14:53:29

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Форматирование Списка в читаемый вывод

Что значит не отрабатывает? Какую ошибку выводит?

 print('\n'.join(['{:<15}{}'.format(*item) for item in zip(param, ospf_route)]))
еще одна скобка в конце не скопировалась.

Отредактировано Stright (Май 31, 2017 14:56:33)

Офлайн

#7 Май 31, 2017 15:01:41

timofmax
Зарегистрирован: 2016-05-19
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматирование Списка в читаемый вывод

Stright
Работает! Но все же если абстрагироваться от моего блудного кода,
Само задание:
Обработать строку ospf_route и вывести информацию в виде:
 Protocol:               OSPF
Prefix:                 10.0.24.0/24
AD/Metric:              110/41
Next-Hop:               10.0.13.3
Last update:            3d18h
Outbound Interface:     FastEthernet0/0
 ospf_route = "O        10.0.24.0/24 [110/41] via 10.0.13.3, 3d18h, FastEthernet0/0"

Фишка в том что split() разбивает Last update на 2 разных элемента, и O заменено на OSPF.
Еще приходится удалять “via”. но это наверное единственное решение и сразу в лоб.
 ospf_route = ospf_route.split()
ospf_route.remove('via')
Есть метод который позволит элегантно обойти эту фигню
и в точности выполнить задание?

Отредактировано timofmax (Май 31, 2017 15:13:38)

Офлайн

#8 Май 31, 2017 22:53:20

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Форматирование Списка в читаемый вывод

  
>>> import re
>>> 
>>> names = ('Protocol',
...          'Prefix',
...          'AD/Metric',
...          'Next-Hop',
...          'Last update',
...          'Outbound Interface')
>>> fields = tuple(i + ':' for i in names)
>>> 
>>> text = 'O        10.0.24.0/24 [110/41] via 10.0.13.3, 3d18h, FastEthernet0/0'
>>> values = re.sub(r',|via|[\[\]]', '', text).split()
>>> 
>>> lst = zip(fields, values)
>>> 
>>> maxwidth = max(map(len, fields))
>>> fmt = '{:%d}{:10}' % (maxwidth + 4)
>>> 
>>> out = '\n'.join(fmt.format(*i) for i in lst)
>>> print(out)
Protocol:              O         
Prefix:                10.0.24.0/24
AD/Metric:             110/41    
Next-Hop:              10.0.13.3 
Last update:           3d18h     
Outbound Interface:    FastEthernet0/0
>>>



Отредактировано py.user.next (Май 31, 2017 22:55:30)

Офлайн

#9 Июнь 1, 2017 15:41:01

timofmax
Зарегистрирован: 2016-05-19
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматирование Списка в читаемый вывод

py.user.next
прочитал прорегулные выражения…
но не совсем смог воткнуть в
 values = re.sub(r',|via|[\[\]]', '', text).split()
Как интерпретировать?
 |via|[\[\]]
| - это или
via - ок без комментариев
| - или
 [\[\]]
- я так понимаю это избавляемся от квадратных скобок
 [110/41]
но как это интерпретировать словесно WTF???

Отредактировано timofmax (Июнь 1, 2017 15:49:16)

Офлайн

#10 Июнь 2, 2017 00:56:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Форматирование Списка в читаемый вывод

timofmax
Как интерпретировать?
|via|[\[\]]

r',|via|[\[\]]'

r - сырая строка (не требует экранирований специальных символов вроде бэкслеша и подобных)
' - кавычка, начинающая строку
, - символ запятая в тексте
| - или
via - последовательность символов via в тексте
| - или
[\[\]]
- символ из множества символов в тексте
' - кавычка, заканчивающая строку

Каждая часть выбора | является регулярным выражением сама по себе. Например, запятая является простейшим регулярным выражением, обозначающим саму себя. А via является составным регулярным выражением, состоящим из трёх простейших регулярных выражений, обозначающих самих себя.

Квадратные скобки задают неупорядоченное множество символов и образуют регулярное выражение, которое совпадает с любым из символов этого множества. Так как сами квадратные скобки являются специальными символами, то для использования квадратных скобок как неспециальных символов их надо проэкранировать с помощью бэкслеша.

Таким образом можно искать квадратные скобки в тексте
  
>>> import re
>>> 
>>> re.search(r'[abc]', '123 [abc] 456]').group()
'a'
>>> 
>>> re.search(r'\[abc\]', '123 [abc] 456]').group()
'[abc]'
>>>
Тут в первом случае ищется один символ из множества a b c, это аналогично выражению a|b|c.
Во втором случае ищется строка из символов, обозначающих самих себя и стоящих именно в такой последовательности.



Отредактировано py.user.next (Июнь 2, 2017 01:03:14)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version