将列表制作成更多子列表

时间:2013-06-13 09:48:14

标签: python

我有一些看起来像这样的数据,行数可能会有所不同:

? (192.168.30.4) at 00:10:60:0a:70:26 [ether]  on vlan20                        
? (192.168.30.1) at 70:ca:9b:99:6a:82 [ether]  on vlan20 
#etc similar format

我想解析这个问题,以便我可以在表格中打印出这样的内容:

#Protocol  Address          Age (min)   Hardware Addr   Type   Interface          
#Internet  192.168.30.4             -   0010.600a.7026  ARPA   Vlan20              
#Internet  192.168.30.1             -   70ca.9b99.6a82  ARPA   Vlan20

我将数据逐行拆分为两个列表

 parse = proc_stdout.split('\n')

这给出了一个包含两个元素的列表:

['? (192.168.30.4) at 00:10:60:0a:70:26 [ether]  on vlan20', '? (192.168.30.1) a
t 70:ca:9b:99:6a:82 [ether]  on vlan20', '']

现在我希望进一步拆分数据,以便在列表的每个空间创建一个新列表。这将产生上面输出的每一行的列表。然后我可以搜索每个列表列表以提取我需要的数据并打印出来。但是你不能拆分列表?最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以将list comprehension或generator语句用于此目的:

parse = proc_stdout.strip('\n').split('\n')
parsed_list = [line.split() for line in parse]

或生成器,如果您将结果处理到其他结构

parse = proc_stdout.strip('\n').split('\n')
parsed_list = (line.split() for line in parse)

答案 1 :(得分:1)

您可以在此处使用strs.splitlines和列表理解:

>>> data="""? (192.168.30.4) at 00:10:60:0a:70:26 [ether]  on vlan20                        
... ? (192.168.30.1) at 70:ca:9b:99:6a:82 [ether]  on vlan20"""
>>> [line.split() for line in data.splitlines()]
[['?', '(192.168.30.4)', 'at', '00:10:60:0a:70:26', '[ether]', 'on', 'vlan20'],
 ['?', '(192.168.30.1)', 'at', '70:ca:9b:99:6a:82', '[ether]', 'on', 'vlan20']
]

对于所需的输出,您必须在此处使用字符串格式:

data="""? (192.168.30.4) at 00:10:60:0a:70:26 [ether]  on vlan20                        
? (192.168.30.1) at 70:ca:9b:99:6a:82 [ether]  on vlan20"""

print "#Protocol  Address          Age (min)   Hardware Addr   Type   Interface"  
for line in data.splitlines():
    _,ip,_,har_ad,_,_,interface = line.split()
    ip = ip.strip('()')
    it = iter(har_ad.split(':'))
    har_ad = ".".join([x+y for x,y in zip(it,it)])
    print "#Internet  {} {:>11s} {:>18s} {:>5s} {:>8s}".format(ip,'-', har_ad,'ARPA' ,interface)        

<强>输出:

#Protocol  Address          Age (min)   Hardware Addr   Type   Interface
#Internet  192.168.30.4           -     0010.600a.7026  ARPA   vlan20
#Internet  192.168.30.1           -     70ca.9b99.6a82  ARPA   vlan20