Найти - Пользователи
Полная версия: Форматирование Списка в читаемый вывод
Начало » Python для новичков » Форматирование Списка в читаемый вывод
1 2
timofmax
и так сама задача Сразу каринка
 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')]

Не могу понять как сделать выхлоп с таким выравниванием и без символов
ZerG
 for i in zip(param, ospf_route):
    print(''.join(i))
timofmax
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

а у меня получается список. которого может быть не должно быть. и мне надо привести все данные в строку…. но у меня ступр
Stright
 print('\n'.join(['{:<15}{}'.format(*item) for item in zip(param, ospf_route)])
timofmax
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
не отратывает в моем коде
Stright
Что значит не отрабатывает? Какую ошибку выводит?
 print('\n'.join(['{:<15}{}'.format(*item) for item in zip(param, ospf_route)]))
еще одна скобка в конце не скопировалась.
timofmax
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')
Есть метод который позволит элегантно обойти эту фигню
и в точности выполнить задание?
py.user.next
  
>>> 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
>>>
timofmax
py.user.next
прочитал прорегулные выражения…
но не совсем смог воткнуть в
 values = re.sub(r',|via|[\[\]]', '', text).split()
Как интерпретировать?
 |via|[\[\]]
| - это или
via - ок без комментариев
| - или
 [\[\]]
- я так понимаю это избавляемся от квадратных скобок
 [110/41]
но как это интерпретировать словесно WTF???
py.user.next
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.
Во втором случае ищется строка из символов, обозначающих самих себя и стоящих именно в такой последовательности.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB