【问题标题】:I need to merge elements of sublist in python我需要在python中合并子列表的元素
【发布时间】:2019-02-09 20:12:36
【问题描述】:

我有以下数据列表

data1 = [[4,5,9],[4,7,2],[11,13,15]]
data2 = [[1,2,3,7],[3,6,8,5],[12,10,15,17]]

我希望按如下方式合并列表。

data = [[4,5,9,1,2,3,7], [4,7,2,3,6,8,5], [11,13,15,12,10,15,17]]

即合并 data1 和 data2 中索引 0 处的元素,合并 data1 和 data 2 中索引 1 处的元素,依此类推..

data1 = [[4,5,9],[4,7,2],[11,13,15]]
data2 = [[1,2,3,7],[3,6,8,5],[12,10,15,17]]
for i in range (0,2):
    for j in range(0,3):
        data1[i].extend(data2[j])
print(data1)

【问题讨论】:

    标签: python list sublist


    【解决方案1】:

    zip() 与列表理解一起使用:

    data1 = [[4,5,9],[4,7,2],[11,13,15]] 
    data2 = [[1,2,3,7],[3,6,8,5],[12,10,15,17]]
    
    data = [x+y for x, y in zip(data1, data2)]
    # [[4, 5, 9, 1, 2, 3, 7], [4, 7, 2, 3, 6, 8, 5], [11, 13, 15, 12, 10, 15, 17]]
    


    如果您需要以正常循环方式使用它,您可以在代码中去掉一个循环(假设两个列表长度相等):
    data1 = [[4,5,9],[4,7,2],[11,13,15]]
    data2 = [[1,2,3,7],[3,6,8,5],[12,10,15,17]]
    
    for i in range(len(data1)):
        data1[i].extend(data2[i])
    
    print(data1)
    # [[4, 5, 9, 1, 2, 3, 7], [4, 7, 2, 3, 6, 8, 5], [11, 13, 15, 12, 10, 15, 17]]
    

    【讨论】:

    • 这两个选项似乎都运行良好,而且速度很快。通过时间比较查看我的答案。
    • @Ralf,太好了。感谢您提出时间比较。
    【解决方案2】:

    尝试以下方法:

    data_to_merge = [data1,data2]
    merged = [sum(ds,[]) for ds in zip(*data_to_merge)]
    

    你也可以使用 numpy 的 hstack,我觉得更直观一点

    merged = np.hstack(data_to_merge)
    

    【讨论】:

    • 使用sum 对两个列表求和看起来真的很臃肿。
    • 如果 OP 有两个以上的 data1,data2 等变量,使用 sum 比添加更好。
    • 否,因为性能受到影响。 sum 在列表上具有二次复杂度。
    • 然后使用numpy的hstack
    • documentation on sum 建议使用itertools.chain 连接可迭代对象。例如。 list(itertools.chain.from_iterable(zip(*data_to_merge)))
    【解决方案3】:

    如果您确定 data1data2 始终具有相同数量的元素(子列表),您可以使用 map 以下方式:

    data1 = [[4,5,9],[4,7,2],[11,13,15]]
    data2 = [[1,2,3,7],[3,6,8,5],[12,10,15,17]]
    data = list(map(lambda x,y:x+y,data1,data2))
    print(data)
    

    输出:

    [[4, 5, 9, 1, 2, 3, 7], [4, 7, 2, 3, 6, 8, 5], [11, 13, 15, 12, 10, 15, 17]]
    

    【讨论】:

      【解决方案4】:

      我比较了其他答案中给出的解决方案:

      def f1(original_data):
          return [
              x+y
              for x, y in zip(*original_data)]
      
      def f2(original_data):
          return [
              sum(x, [])
              for x in zip(*original_data)]
      
      def f3(original_data):
          data_1 = original_data[0]
          data_2 = original_data[1]
      
          for i in range(len(data_1)):
              data_1[i].extend(data_2[i])
      
          return data_1
      
      def f4(original_data):
          return np.hstack(original_data).tolist()
      

      时间安排是:

      >>> import timeit
      >>> timeit.timeit('f(data)', 'from __main__ import data,  f1 as f')
      0.6496335420088144
      >>> timeit.timeit('f(data)', 'from __main__ import data,  f2 as f')
      1.1647848110005725
      >>> timeit.timeit('f(data)', 'from __main__ import data,  f3 as f')
      0.6762638779910048
      >>> timeit.timeit('f(data)', 'from __main__ import data,  f4 as f')
      8.561359490995528
      

      我的f1() 中的版本似乎是这些短名单中最快的。

      注意:注意f3()中的代码,因为它修改了原始数据,所以你必须将它作为最后一个运行;其他函数会返回一个新副本,并且不要触及原始副本。

      一个区别是,f2() 中的版本适用于多个列表,而不仅仅是 2 个;但速度较慢。 f4()(使用numpy)也适用于多个列表,但速度要慢很多。

      【讨论】:

        【解决方案5】:

        您可以使用运算符concat()和函数starmap();:

        from operator import concat
        from itertools import starmap
        
        list(starmap(concat, zip(data1, data2)))
        # [[4, 5, 9, 1, 2, 3, 7], [4, 7, 2, 3, 6, 8, 5], [11, 13, 15, 12, 10, 15, 17]]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-25
          • 2016-08-15
          相关资源
          最近更新 更多