【问题标题】:Split a list into various slices and concatenate it将列表拆分为多个切片并将其连接起来
【发布时间】:2020-10-17 07:04:58
【问题描述】:

我看到了与我类似的问题,但我没有研究什么真正解决了我的问题。
所以,基本上我想拆分一个列表,以便删除一些项目并将其连接回来。这些项目对应于由元组列表给出的索引。

import numpy as np
arr = ['x','y','z','a','b','c','d','e','f','g',2,3,4]
indices = [(2,4),(7,9)] #INDEXES THAT NEED TO BE CUT OUT
print ([list1[0:s] +list1[s+1:e] for s,e in indices])
#Returns: [['x', 'y', 'z', 'a'], ['x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f']]

我从one of the answers from this post 获得的这段代码几乎可以满足我的需要,但我尝试将其调整为循环遍历索引的第一个索引一次,但它执行了两次并且它不包括其余的列表。

我希望我的最终列表从零索引拆分为第一个元组上的第一项,依此类推,使用 for 循环或一些迭代器。
像这样的,

`final_arr = arr[0:indices[0][0]] + arr[indices[0][1]:indices[1][0]] + arr[indices[1][1]:]<br/>
#Returns: [['x','y','a','b','c','f','g',2,3,4]]`

如果有人可以使用 for 循环来做到这一点,我会更容易看到您如何理解问题,然后我可以尝试适应使用更短的代码。

【问题讨论】:

  • 能否添加最终的预期结果?这将有助于理解您的问题。
  • 当然,我刚刚添加了它。
  • 您的输出与您的问题不符。当我复制并粘贴您的代码时,您的预期结果中的值是错误的。
  • 我已根据您的final_arr 逻辑添加了一个答案,但是输出与您在#Returns 中描述的不同。如果不是预期的输出,请告诉我们。

标签: python list slice


【解决方案1】:

使用sorteddel 切片对索引进行排序。你需要reverse=True 否则后面的片的索引是不正确的。

for x, y in sorted(indices, reverse=True):
    del(arr[x:y])

print(arr)

>>> ['x', 'y', 'b', 'c', 'd', 'g', 2, 3, 4]

这与您得到的结果相同

print(arr[0:indices[0][0]] + arr[indices[0][1]:indices[1][0]] + arr[indices[1][1]:])

>>> ['x', 'y', 'b', 'c', 'd', 'g', 2, 3, 4]

【讨论】:

    【解决方案2】:
    
    arr = ['x','y','z','a','b','c','d','e','f','g',2,3,4]
    indices = [(2,4),(7,9)] #INDEXES THAT NEED TO BE CUT OUT
    
    import itertools
    
    ignore = set(itertools.chain.from_iterable(map(lambda i: range(*i), indices)))
    out = [c for idx, c in enumerate(arr) if idx not in ignore]
    
    print(out)
    print(arr[0:indices[0][0]] + arr[indices[0][1]:indices[1][0]] + arr[indices[1][1]:])
    

    输出,

    ['x', 'y', 'b', 'c', 'd', 'g', 2, 3, 4]
    ['x', 'y', 'b', 'c', 'd', 'g', 2, 3, 4]
    

    【讨论】:

    • 嗨@blakev 你能向我解释一下这个 itertools.chain.from_iterable 到底是做什么的吗?我认为一段代码可能会起作用。但是我是 Python 新手,那些花哨的方法很难理解!
    • itertools.chain.from_iterable 获取列表并将其压缩为“平面”列表。 Python documentation.
    【解决方案3】:

    像这样:

    import numpy as np
    arr = ['x','y','z','a','b','c','d','e','f','g',2,3,4]
    indices = [(2,4),(7,9)] #INDEXES THAT NEED TO BE CUT OUT
    print ([v for t in indices for i,v in enumerate(arr) if i not in range(t[0],t[1])])
    

    输出:

    ['x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 2, 3, 4, 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 2, 3, 4]
    

    【讨论】:

      【解决方案4】:

      1- 如果您可以删除列表项:
      我使用JimithyPicker 的示例。我更改了索引列表(已删除的项目),因为总是删除一个索引会更改列表的大小。

      arr = ['x','y','z','a','b','c','d','e','f','g',2,3,4]
      indices = [2,5,5] #INDEXES THAT NEED TO BE CUT OUT
      
      for index in indices:
          arr.pop(index)
      
      final_arr = [arr]
      print(final_arr)
      

      输出:

      [['x', 'y', 'a', 'b', 'c', 'f', 'g', 2, 3, 4]]
      

      2- 如果您无法删除项目:
      在这种情况下有必要更改第二个索引!该数字与您想要的输出不匹配。
      索引 = [(2,4),(7,9)] 具有输出: ['x', 'y', 'a', 'b', 'c', 'd', 'f', ' g', 2, 3, 4]

      arr = ['x','y','z','a','b','c','d','e','f','g',2,3,4]
      indices = [(2,4),(6,9)] #INDEXES THAT NEED TO BE CUT OUT
      
      final_arr = arr[0:indices[0][0]] + arr[indices[0][1]-1:indices[1][0]] + arr[indices[1][1]-1:]
      print(final_arr)
      

      输出:

      ['x','y','a','b','c','f','g',2,3,4]
      

      【讨论】:

        猜你喜欢
        • 2021-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多