【问题标题】:how to get subset of list from index of list in python如何从python中的列表索引获取列表的子集
【发布时间】:2019-05-06 16:27:06
【问题描述】:

我有一个字符串列表,我需要根据它们的索引列表以通用方式从列表中提取子集

indx=[0,5,7] # index list

a = ['a', 'b', 3, 4, 'd', 6, 7, 8]

我需要在第一次迭代中以通用方式获取子集:

a[0:5]

第二次迭代:

a[5:7]

第三次迭代:

a[7:]

我试过的代码:

for i in indx:
    if len(indx)==i:
        print(a[i:])
    else:
        print(a[i:i+1])

预期输出:

a[0:5]=='a', 'b', 3, 4, 'd'
a[5:7]=6, 7
a[7:]=8

【问题讨论】:

    标签: python python-3.x text-processing


    【解决方案1】:

    使用理解:

    >>> [a[x:y] for x,y in zip(indx,[*indx[1:], None])]
    [['a', 'b', 3, 4, 'd'], [6, 7], [8]]
    

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      indx.append(len(a))
      print(*[a[i:j] for i,j in zip(indx, indx[1:])], sep='\n')
      

      输出

      ['a', 'b', 3, 4, 'd']
      [6, 7]
      [8]
      

      【讨论】:

        【解决方案3】:
        results = [a[indx[i]:indx[i+1]] for i in range(len(indx)-1)]
        

        将返回一个包含您想要的 3 个列表的列表。

        【讨论】:

          【解决方案4】:

          您考虑一次遍历两个项目是对的,但问题是for i in lst 不使用索引,并且会失败。

          一种迭代并获取两个项目的方法是使用 zip。

          indx=[0,5,7] # index list
          
          a = ['a', 'b', 3, 4, 'd', 6, 7, 8]
          
          if indx[0] != 0:
              indx = [0] + indx #fixes left indexing in case 0 is not present
          if indx[-1] != len(a):
              indx += [len(a)] #fixes right indexing to make sure you get all values from the list.
          
          print(indx) #[0, 5, 7, 8]
          for left, right in zip(indx, indx[1:]):
              print(a[left: right])
          #Output:
          ['a', 'b', 3, 4, 'd']
          [6, 7]
          [8]
          

          【讨论】:

            【解决方案5】:

            给你。

            for i in range(len(indx)):
            try:
                print("a[%s:%s] ==" % (indx[i], indx[i + 1]) + " ", end=" ")
                print(a[indx[i]:indx[i + 1]])
            except IndexError:
                print("a[%s:] ==" % (indx[i]) + " ", end=" ")
                print(a[indx[i]:])
            

            输出:

            a[0:5] ==  ['a', 'b', 3, 4, 'd']
            a[5:7] ==  [6, 7]
            a[7:] ==  [8]
            

            【讨论】:

              【解决方案6】:

              您可以使用slice 类型将您的索引列表转换为列表切片。正如其他人已经发布的那样,使用zip 创建开始-结束对:

              >>> print(list(zip(indx, indx[1:]+[None])))
              [(0, 5), (5, 7), (7, None)]
              

              我们使用这些对来定义切片:

              >>> slices = [slice(a, b) for a, b in zip(indx, indx[1:]+[None])]
              

              然后像使用整数索引一样使用切片对象,但切片将选择切片开始-结束对中定义的列表子字符串:

              >>> for slc in slices:
              ...     print(a[slc])
              

              给予:

              ['a', 'b', 3, 4, 'd']
              [6, 7]
              [8]
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-03-30
                • 1970-01-01
                • 2012-05-10
                • 2014-04-20
                • 2011-03-10
                • 1970-01-01
                • 1970-01-01
                • 2014-02-03
                相关资源
                最近更新 更多