【问题标题】:How to slice a 2d list into two separate lists in python?python - 如何在python中将二维列表分割成两个单独的列表?
【发布时间】:2018-11-28 07:57:38
【问题描述】:
temp = [['1979', '74.6.160.107'], ['1979', '216.115.100.123'], ['1979', '216.115.100.124'], ['1979', '74.6.160.106'], ['1979', '192.168.1.33'], ['1979', '74.6.160.106'], ['1979', '216.115.100.124'], ['1979', '216.115.100.123'], ['1979', '74.6.160.107'], ['1979', '192.168.1.24'], ['1979', '127.0.0.1'], ['1979', '192.168.1.24'], ['1979', '127.0.0.1'], ['1979', '192.168.1.118'], ['1979', '8.8.8.8'], ['1979', '64.14.29.250'], ['1979', '64.14.29.252'], ['1979', '64.14.29.251'], ['1979', '64.14.29.50'], ['1979', '192.168.1.11'], ['1979', '8.8.8.8'], ['1979', '2404', '6800', '4007'], ['1979', '192.168.1.24'], ['1979', '127.0.0.1'], ['1979']]

这是我的 2d 列表,我希望将其拆分为两个列表,例如:

id = ['1979', '1979', '1979', #and so on..]
ip = ['74.6.160.107', '216.115.100.123', '216.115.100.124' #and so on..]

如何将其拆分为两个单独的列表?

我还有另一个清单:

dates = ['Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:23', 'Jun 15 16:26:23', 'Jun 15 16:26:30', 'Jun 15 16:26:30', 'Jun 15 16:26:32', 'Jun 15 16:26:32', 'Jun 15 16:26:32', 'Jun 15 16:26:32', 'Jun 15 16:26:32', 'Jun 15 16:26:32', 'Jun 15 16:26:33', 'Jun 15 16:26:33', 'Jun 15 16:26:33', 'Jun 15 16:26:37', 'Jun 15 16:26:38', 'Jun 15 16:26:38']

我想将“日期”和“IP”加入另一个列表,如下所示:

finalResult = [['Jun 15 16:26:21', '74.6.160.107'], ['Jun 15 16:26:21' , '216.115.100.123'] #and so on.. ]

如上所示如何加入他们?

【问题讨论】:

  • 为什么你的最后一项只有一个元素,即['1979']?这是正确的吗?
  • @jpp 列表是通过解析日志文件生成的,['1979']是错误可以忽略...

标签: python arrays list slice


【解决方案1】:

使用列表理解和生成器表达式遍历第一列值,然后是第二列值:

id, ip = ([el[column] for el in temp] for column in range(2))

使用 zip 和列表理解连接两个列表:

finalResult = [[date, ip_addr] for date, ip_addr in zip(dates, ip)]

如果您需要检查 temp 中的无效值,您可以执行类似的操作

id, ip = ([el[column] for el in temp if len(el) == 2] for column in range(2))

【讨论】:

    【解决方案2】:

    temp 拆分为两个列表:

    id = [i[0] for i in temp]
    ip = [i[1] for i in temp]  
    

    请注意,在您的临时示例中,您的最后一个索引是只有一个变量的列表,这将导致IndexError

    datesip 合并到finalResult

    finalResult = [[i, j] for i, j in zip(dates, ip)]
    

    【讨论】:

      【解决方案3】:

      第一个答案是简单的转置。它可以在 numpy 的帮助下完成。可能有一种更 pythonic 的方式来完成这项任务,但这就是我所使用的。

      import numpy as np    
      a = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
      np.array(a).T.tolist()
      

      给予

      [[1, 3, 5, 7, 9], [2, 4, 6, 8, 10]]

      第二个,确保两个列表的长度相等。

      a = [1, 2, 3, 4, 5, 6]
      b = ['a', 'b', 'c', 'd', 'e', 'f']
      c = [[ax, bx] for ax, bx in zip(a, b)]
      

      给予

      [[1, 'a'], [2, 'b'], [3, 'c'], [4, 'd'], [5, 'e'], [6, 'f' ]]

      【讨论】:

        【解决方案4】:

        就您的目的而言,tuple 可能与list 一样好。因此,您可以使用zip 将列表列表拆分为两个元组:

        year, ip = zip(*temp)
        

        然后通过zip 组合您的日期和IP 地址以形成一个元组列表:

        res = list(zip(dates, ip))
        

        上述方法依赖于tempdates具有相同数量的元素;并且在temp 中的每个子列表上都有两个元素。

        【讨论】:

          【解决方案5】:

          创建两个列表:

          year = [i[0] for i in temp]
          ip = [i[1] for i in temp[:-1]]
          

          第二个列表我们删掉了temp的最后一个元素,因为它只有年份值,可能你漏掉了,建议你检查一下。

          因为temp的最后一个元素没有ip值,所以datesleniplen是不同的。 要合并datesip,只需使用简单的for loop

          final = []
          for i, j in zip(dates, ip):
                  final.append([i, j])
          

          然后将dates 的最后一个元素添加到final,如下所示:final.append([dates[-1]])

          【讨论】:

            【解决方案6】:

            我建议在进行拆分和连接之前过滤标准结构和有效 IP 的输入列表,如下所示:

            #testasplilist.py
            
            def validate_ip(s):
                a = s.split('.')
                if len(a) != 4:
                    return False
                for x in a:
                    if not x.isdigit():
                        return False
                    i = int(x)
                    if i < 0 or i > 255:
                        return False
                return True
            
            #input data
            temp = [['1979', '74.6.160.107'], ['1979', '216.115.100.123'], ['1979', '216.115.100.124'], ['1979', '74.6.160.106'], ['1979', '192.168.1.33'], ['1979', '74.6.160.106'], ['1979', '216.115.100.124'], ['1979', '216.115.100.123'], ['1979', '74.6.160.107'], ['1979', '192.168.1.24'], ['1979', '127.0.0.1'], ['1979', '192.168.1.24'], ['1979', '127.0.0.1'], ['1979', '192.168.1.118'], ['1979', '8.8.8.8'], ['1979', '64.14.29.250'], ['1979', '64.14.29.252'], ['1979', '64.14.29.251'], ['1979', '64.14.29.50'], ['1979', '192.168.1.11'], ['1979', '8.8.8.8'], ['1979', '2404', '6800', '4007'], ['1979', '192.168.1.24'], ['1979', '127.0.0.1'], ['1979']]
            
            dates = ['Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:23', 'Jun 15 16:26:23', 'Jun 15 16:26:30', 'Jun 15 16:26:30', 'Jun 15 16:26:32', 'Jun 15 16:26:32', 'Jun 15 16:26:32', 'Jun 15 16:26:32', 'Jun 15 16:26:32', 'Jun 15 16:26:32', 'Jun 15 16:26:33', 'Jun 15 16:26:33', 'Jun 15 16:26:33', 'Jun 15 16:26:37', 'Jun 15 16:26:38', 'Jun 15 16:26:38']
            
            # filter temp for valid IP
            c= []
            for x in temp:
                if (len(x) == 2) and validate_ip(x[1]):
                    c.append(x)
            
            print(c)
            
            
            #filter dates for valid IP
            d=[]
            for x,y  in zip(temp, dates):
                if (len(x) == 2) and validate_ip(x[1]):
                     d.append(y)
            
            print(d)
            
            
            a = [x[0] for x in c]
            
            b = [x[1] for x in c]
            
            print(a)
            
            print(b)
            
            print(len(c))
            
            
            print (len(d))
            
            finalResult = [[x, y] for x, y in zip(d, b)]
            
            print(finalResult)
            

            结果:

            [['1979', '74.6.160.107'], ['1979', '216.115.100.123'], ['1979', '216.115.100.124'], ['1979', '74.6.160.106'], ['1979', '192.168.1.33'], ['1979', '74.6.160.106'], ['1979', '216.115.100.124'], ['1979', '216.115.100.123'], ['1979', '74.6.160.107'], ['1979', '192.168.1.24'], ['1979', '127.0.0.1'], ['1979', '192.168.1.24'], ['1979', '127.0.0.1'], ['1979', '192.168.1.118'], ['1979', '8.8.8.8'], ['1979', '64.14.29.250'], ['1979', '64.14.29.252'], ['1979', '64.14.29.251'], ['1979', '64.14.29.50'], ['1979', '192.168.1.11'], ['1979', '8.8.8.8'], ['1979', '192.168.1.24'], ['1979', '127.0.0.1']]
            ['Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:21', 'Jun 15 16:26:23', 'Jun 15 16:26:23', 'Jun 15 16:26:30', 'Jun 15 16:26:30', 'Jun 15 16:26:32', 'Jun 15 16:26:32', 'Jun 15 16:26:32', 'Jun 15 16:26:32', 'Jun 15 16:26:32', 'Jun 15 16:26:32', 'Jun 15 16:26:33', 'Jun 15 16:26:33', 'Jun 15 16:26:37', 'Jun 15 16:26:38']
            ['1979', '1979', '1979', '1979', '1979', '1979', '1979', '1979', '1979', '1979', '1979', '1979', '1979', '1979', '1979', '1979', '1979', '1979', '1979', '1979', '1979', '1979', '1979']
            ['74.6.160.107', '216.115.100.123', '216.115.100.124', '74.6.160.106', '192.168.1.33', '74.6.160.106', '216.115.100.124', '216.115.100.123', '74.6.160.107', '192.168.1.24', '127.0.0.1', '192.168.1.24', '127.0.0.1', '192.168.1.118', '8.8.8.8', '64.14.29.250', '64.14.29.252', '64.14.29.251', '64.14.29.50', '192.168.1.11', '8.8.8.8', '192.168.1.24', '127.0.0.1']
            23
            23
            [['Jun 15 16:26:21', '74.6.160.107'], ['Jun 15 16:26:21', '216.115.100.123'], ['Jun 15 16:26:21', '216.115.100.124'], ['Jun 15 16:26:21', '74.6.160.106'], ['Jun 15 16:26:21', '192.168.1.33'], ['Jun 15 16:26:21', '74.6.160.106'], ['Jun 15 16:26:21', '216.115.100.124'], ['Jun 15 16:26:21', '216.115.100.123'], ['Jun 15 16:26:21', '74.6.160.107'], ['Jun 15 16:26:23', '192.168.1.24'], ['Jun 15 16:26:23', '127.0.0.1'], ['Jun 15 16:26:30', '192.168.1.24'], ['Jun 15 16:26:30', '127.0.0.1'], ['Jun 15 16:26:32', '192.168.1.118'], ['Jun 15 16:26:32', '8.8.8.8'], ['Jun 15 16:26:32', '64.14.29.250'], ['Jun 15 16:26:32', '64.14.29.252'], ['Jun 15 16:26:32', '64.14.29.251'], ['Jun 15 16:26:32', '64.14.29.50'], ['Jun 15 16:26:33', '192.168.1.11'], ['Jun 15 16:26:33', '8.8.8.8'], ['Jun 15 16:26:37', '192.168.1.24'], ['Jun 15 16:26:38', '127.0.0.1']]
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-05-06
              • 2013-06-16
              • 2016-12-04
              • 2010-11-16
              • 2014-11-17
              • 1970-01-01
              相关资源
              最近更新 更多