【问题标题】:joining a list together with index's将列表与索引一起加入
【发布时间】:2019-02-23 21:19:15
【问题描述】:

我一直在研究桶排序算法。

可能很简单,但我如何在不中断第二个列表的情况下将这些存储桶(索引)连接在一起。

list1 = [[], ['aa', 'aa'], [], ['bbbb', 'bbbb']]

隐藏在测试文件中:

list2 = [[], ['aa', 'aa']]

我追求的结果是:

list1 = ['aa', 'aa', 'bbbb', 'bbbb']
list2 = ['aa', 'aa']

我已设法按大小对这些列表进行排序,但无法在不中断 list2 的情况下将它们放入单个列表中。因为索引会超出范围。

谢谢大家。

【问题讨论】:

    标签: python python-3.x sorting indexing


    【解决方案1】:

    要加入这样一个列表的元素,只需使用

    >>> import itertools
    >>> list(itertools.chain.from_iterable(list1))
    ['aa', 'aa', 'bbbb', 'bbbb']
    

    【讨论】:

      【解决方案2】:

      您可以添加/连接它们。

      list1 = [[], ['aa', 'aa'], [], ['bbbb', 'bbbb']]
      finishlist = []
      for element in list1:
          finishlist = finishlist + element
      
      print(finishlist)
      

      输出:

      ['aa', 'aa', 'bbbb', 'bbbb']
      

      【讨论】:

      • 使用finishlist.extend(element) 会更有效(而且长度检查确实是多余的)
      • 根据我所做的各种测试,我不相信 extend 更有效,但你说得对,长度不是必需的,我编辑并删除了它。
      • 对于小列表的效果将是无法估量的......例如尝试对一百个列表的一百个列表的简单测试。然后例如,%timeit using_plus 需要 1.02 毫秒,但 %timeit using_extend 需要 29 微秒,这明显更快(快 35 倍)。
      【解决方案3】:

      您可以使用简单的for 循环:

      list1 = [[], ['aa', 'aa'], [], ['bbbb', 'bbbb']]
      
      l = []
      for i in list1:
          l += i # or l.extend(i)
      
      print(l)
      # ['aa', 'aa', 'bbbb', 'bbbb']
      

      您也可以使用列表推导:

      [i for subl in list1 for i in subl]
      

      【讨论】:

        【解决方案4】:

        您可以迭代地将列表合并为一个列表:

        from functools import reduce
        list1 = [[], ['aa', 'aa'], [], ['bbbb', 'bbbb']]
        
        reduced = reduce((lambda x, y: x + y), list1)
        print(reduced)  # prints ['aa', 'aa', 'bbbb', 'bbbb']
        

        【讨论】:

          猜你喜欢
          • 2018-02-03
          • 1970-01-01
          • 1970-01-01
          • 2020-09-09
          • 1970-01-01
          • 2014-03-29
          • 2021-08-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多