【问题标题】:Python Slice a List Using a List of Multiple TuplesPython 使用多个元组列表对列表进行切片
【发布时间】:2017-01-29 18:53:03
【问题描述】:

我有一个数字列表,我想对从多个元组列表中给出的数字范围进行切片。例如,我有一个如下所示的列表:

my_list = [ 5, 8, 3, 0, 0, 1, 3, 4, 8, 13, 0, 0, 0, 0, 21, 34, 25, 91, 61, 0, 0,] 

我还有一个元组列表,它们是我想要的值的索引,如下所示:

my_tups = [(5,9), (14,18)]

如何使用 my_tups 作为索引只返回 my_list 的值?

【问题讨论】:

    标签: python list tuples slice


    【解决方案1】:

    使用列表推导:

    my_list = [ 5, 8, 3, 0, 0, 1, 3, 4, 8, 13, 0, 0, 0, 0, 21, 34, 25, 91, 61, 0, 0,]
    my_tups = [(5,9), (14,18)]
    
    new_list = [my_list[i:j] for i,j in my_tups]
    

    在您发表评论后:

    my_list = [ 5, 8, 3, 0, 0, 1, 3, 4, 8, 13, 0, 0, 0, 0, 21, 34, 25, 91, 61, 0, 0]
    my_tups = [(5,9), (14,18)]
    
    new_list = [0 for i in my_list] # Create a list filled with zeros
    
    for i,j in my_tups:
        new_list[i:j] = my_list[i:j] # Replace items with items from my_list using the indexes from my_tups
    

    输出:

    >>> new_list
    [0, 0, 0, 0, 0, 1, 3, 4, 8, 0, 0, 0, 0, 0, 21, 34, 25, 91, 0, 0, 0]
    

    【讨论】:

    • 这对我来说似乎是最简单和合乎逻辑的解决方案
    • @Chris_Rands 和最快
    • @Kate 你的意思是 [0,0,0,0,0,1,3,4,8,13,0,0,0,0,21,34, 25,91, 0,0,0](末尾 3 个零而不是 2 个)?
    • 是的,我忘了加一个
    【解决方案2】:

    你可以在列表理解上做这样的事情

    slices = [my_list[x:y] for x, y in my_tups if x < len(my_list) and y < len(my_list)]
    

    【讨论】:

      【解决方案3】:

      一种可能性

      from itertools import chain
      
      my_iter = chain(*[my_list[start:end] for start, end in my_tups])
      
      [l for l in my_iter]
      

      给了

      [1, 3, 4, 8, 21, 34, 25, 91]
      

      【讨论】:

      • 这太好了,谢谢!有没有办法返回在数字周围填充零的列表?所以最终结果是[0,0,0,0,0,1,3,4,8,13,0,0,0,0,21,34, 25,91,61,0,0]跨度>
      【解决方案4】:

      您也可以将sliceitertools.starmap 一起使用:

      from itertools import starmap
      
      my_list = [ 5., 8., 3., 0., 0., 1., 3., 4., 8., 13., 0., 0., 0., 0., 21., 34., 25., 91., 61., 0., 0.]
      my_tups = [(5,9), (14,18)]
      
      result = [my_list[slc] for slc in starmap(slice, my_tups)]
      # [[1.0, 3.0, 4.0, 8.0], [21.0, 34.0, 25.0, 91.0]]
      

      使用starmap,您可以将 step 参数添加到任意切片的任何

      >>> my_tups = [(5,9,2), (14,18)] # step first slice by 2
      >>> [my_list[slc] for slc in starmap(slice, my_tups)]
      [[1.0, 4.0], [21.0, 34.0, 25.0, 91.0]]
      

      【讨论】:

      • 您应该将其作为一个新问题提出
      【解决方案5】:

      这应该可以解决问题:

      for a, b in my_tups:
          print(my_list[a:b])
      

      您可以对列表执行其他操作,而不是打印。

      【讨论】:

        【解决方案6】:

        你可以使用内置的slice如下

        my_list = [5, 8, 3, 0, 0, 1, 3, 4, 8, 13, 0, 0, 0, 0, 21, 34, 25, 91, 61, 0, 0]
        my_tups = [(5, 9), (14, 18)]
        
        my_list2 = [my_list[slice(*o)] for o in my_tups]
        print(my_list2)
        
        >>> [[1, 3, 4, 8], [21, 34, 25, 91]]
        

        【讨论】:

          【解决方案7】:

          如果我正确理解了这个问题,您希望从my_list 返回5:914:18 范围内的值。下面的代码应该做到这一点

          my_list = [ 5, 8, 3, 0, 0, 1, 3, 4, 8, 13, 0, 0, 0, 0, 21, 34, 25, 91, 61, 0, 0]
          my_tups = [(5,9), (14,18)]
          
          def flattens(lists):
              return sum(lists, [])
          flatten([my_list[lo:hi] for (lo, hi) in my_tups])
          # gives [1, 3, 4, 8, 21, 34, 25, 91]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-08-27
            • 2020-02-27
            • 2012-05-21
            • 2019-03-17
            • 2018-11-21
            • 1970-01-01
            相关资源
            最近更新 更多