2013-06-14 2 views
0

У меня есть некоторые данные в списке списков. Я пытаюсь распечатать его равномерно в таблице с форматом, однако разные длины действительно отбрасывают его. Есть ли способ сделать это просто? Или мне нужно делать что-то неловкое, как вычислять максимум каждого столбца и накладывать другие на пробелы?таблица печати из списка данных

table_data = [['vlan1', '0013.F200.0058', '192.168.2.2'], 
       ['vlan20', '0013.F200.0058', '192.168.30.2'], 
       ['vlan20', '0010.600a.7026', '192.168.30.4'], 
       ['vlan20', '70ca.9b99.6a82', '192.168.30.1'], 
       ['vlan100', '0013.F200.0058', '192.168.110.2']] 


for i in table_data: 
    interface,mac,ip = i 
    print "Internet {} {:>18s} {:>7s} {:>8s}".format(ip, mac,'ARPA' ,interface)  


Protocol Address    Hardware Addr Type Interface     
Internet 192.168.2.2  0013.F200.0058 ARPA  vlan1      
Internet 192.168.30.2  0013.F200.0058 ARPA vlan20      
Internet 192.168.30.4  0010.600a.7026 ARPA vlan20      
Internet 192.168.30.1  70ca.9b99.6a82 ARPA vlan20      
Internet 192.168.110.2  0013.F200.0058 ARPA vlan100 

ответ

1

Я думаю, что использование таблиц ('\ t') должно сделать трюк.

print "Internet\t{}\t{:>18s}\t{:>7s}\t{:>8s}".format(ip, mac,'ARPA' ,interface) 

Я тестировал его через терминал и, похоже, работал, выравнивая его правильно.

+0

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

2

Просто fiddeling со смещениями дать мне это:

print "Internet {:>16}{:>16}{:>8}{:>10}".format(ip, mac, 'ARPA' ,interface) 

Выход:

Internet  192.168.2.2 0013.F200.0058 ARPA  vlan1 
Internet 192.168.110.2 0013.F200.0058 ARPA vlan100 
Internet  192.168.30.2 0013.F200.0058 ARPA vlan50 
Internet  192.168.30.4 0010.600a.7026 ARPA vlan20 
Internet  192.168.30.1 70ca.9b99.6a82 ARPA  vlan2 
1
table_data = [['vlan1', '0013.F200.0058', '192.168.2.2'], 
       ['vlan20', '0013.F200.0058', '192.168.30.2'], 
       ['vlan20', '0010.600a.7026', '192.168.30.4'], 
       ['vlan20', '70ca.9b99.6a82', '192.168.30.1'], 
       ['vlan100','0013.F200.0058', '192.168.110.2']] 

print "Protocol Address   Hardware Addr Type Interface " 
for i in table_data: 
    interface,mac,ip = i 
    print "Internet {:15} {:>15} {:^7s} {}".format(ip, mac,'ARPA' ,interface) 

Выход:

Protocol Address   Hardware Addr Type Interface 
Internet 192.168.2.2  0013.F200.0058 ARPA vlan1 
Internet 192.168.30.2  0013.F200.0058 ARPA vlan20 
Internet 192.168.30.4  0010.600a.7026 ARPA vlan20 
Internet 192.168.30.1  70ca.9b99.6a82 ARPA vlan20 
Internet 192.168.110.2 0013.F200.0058 ARPA vlan100 
0

Незначительные вариации:

for i in table_data: 
    interface,mac,ip = i 

    ip_aligned = "{:>3s}.{:>3s}.{:>3s}.{:>3s}".format(*ip.split('.')) 
    mac_normalized = mac.lower() # some MAC addr are lower case other upper case 

    print("Internet {:16s} {:>18s} {:>7s} {:>8s}".format(
         ip_aligned, 
         mac_normalized, 
         'ARPA' 
         ,interface 
     )) 

Более или менее читаемый в зависимости от вас вкус:

Internet 192.168. 2. 2  0013.f200.0058 ARPA vlan1 
Internet 192.168. 30. 2  0013.f200.0058 ARPA vlan20 
Internet 192.168. 30. 4  0010.600a.7026 ARPA vlan20 
Internet 192.168. 30. 1  70ca.9b99.6a82 ARPA vlan20 
Internet 192.168.110. 2  0013.f200.0058 ARPA vlan100 
1

Вариант, который форматирует заголовок, а также:

header = [['Protocol', 'Address', 'Hardware Addr', 'Type', 'Interface']] 
table_data = [['vlan1', '0013.F200.0058', '192.168.2.2'], 
       ['vlan20', '0013.F200.0058', '192.168.30.2'], 
       ['vlan20', '0010.600a.7026', '192.168.30.4'], 
       ['vlan20', '70ca.9b99.6a82', '192.168.30.1'], 
       ['vlan100','0013.F200.0058', '192.168.110.2']] 
for i in header + table_data: 
print "{} {:15} {:<14} {:^7s} {}".format(
    *i if i[3:] else ('Internet', i[2], i[1], 'ARPA', i[0])) 
Смежные вопросы