【问题标题】:Make lists into further sublists将列表制作成进一步的子列表
【发布时间】:2013-06-13 09:48:14
【问题描述】:

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

? (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', '']

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

【问题讨论】:

    标签: python


    【解决方案1】:

    您可以为此目的使用列表推导式或生成器语句:

    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 也 OP 可能希望 proc_stdout.rstrip('\n').split('\n') 末尾没有空字符串
    • 感谢@jamylak 我已经发现并修复了它,但使用了 srtip。我会查找它和rstrip之间的区别。谢谢 oleg,太完美了。
    • strip 也不错(只要您的字符串可能以换行符开头)
    【解决方案2】:

    您可以在此处使用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
    

    【讨论】:

    • 我先通过它来理解它,_,ip,_,har_ad,_,_,interface = line.split()你只是在调用你不想要的一切_?这会将它们全部附加到该变量吗?
    • @Paul 这称为sequence unpacking,它将列表中的项目(line.split()) 分配给LHS 上的变量。_ 只是一个虚拟变量,意味着忽略这些项目。
    • 啊,好吧,我只是想知道它是被忽略还是实际附加到该变量,非常感谢。
    猜你喜欢
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 2019-03-28
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多