python 基于索引范围将列表拆分为子列表

tcbh2hod  于 2023-04-19  发布在  Python
关注(0)|答案(9)|浏览(191)

如何根据索引范围将列表拆分为子列表?
例如,原始列表:

list1 = [x,y,z,a,b,c,d,e,f,g]

使用索引范围0-4:

list1a = [x,y,z,a,b]

使用索引范围5-9:

list1b = [c,d,e,f,g]

我已经知道包含特定字符串的列表元素的(可变)索引,并希望根据这些索引值拆分列表。
还需要拆分成数量可变的子列表,即:

list1a
list1b
.
.
list1[x]
3zwtqj6y

3zwtqj6y1#

在Python中,它被称为切片。下面是python's slice notation的示例:

>>> list1 = ['a','b','c','d','e','f','g','h', 'i', 'j', 'k', 'l']
>>> print list1[:5]
['a', 'b', 'c', 'd', 'e']
>>> print list1[-7:]
['f', 'g', 'h', 'i', 'j', 'k', 'l']

注意你可以用正数或负数来切片,当你用负数时,意味着我们从右向左切片。

a6b3iqyw

a6b3iqyw2#

请注意,您可以在切片中使用变量:

l = ['a',' b',' c',' d',' e']
c_index = l.index("c")
l2 = l[:c_index]

这将把l的前两个条目放在l2中

afdcj2ne

afdcj2ne3#

如果你已经知道指数:

list1 = ['x','y','z','a','b','c','d','e','f','g']
indices = [(0, 4), (5, 9)]
print [list1[s:e+1] for s,e in indices]

请注意,我们在末尾添加+1以使范围包含...

gjmwrych

gjmwrych4#

list1a=list[:5]
list1b=list[5:]
kxeu7u2r

kxeu7u2r5#

如果您有多个索引或知道需要获取的索引范围,则可以使用以下方法之一:
split_points -拆分字符串或列表的点
k -需要分割的范围,例如= 3

split_points = [i for i in range(0, len(string), k)]

parts = [string[ind:ind + k] for ind in split_points]
sirbozc5

sirbozc56#

list1=['x','y','z','a','b','c','d','e','f','g']
find=raw_input("Enter string to be found")
l=list1.index(find)
list1a=[:l]
list1b=[l:]
fcipmucu

fcipmucu7#

考虑以下示例的核心伪代码:

def slice_it(list_2be_sliced, indices):
    """Slices a list at specific indices into constituent lists.
    """
    indices.append(len(list_2be_sliced))
    return [list_2be_sliced[indices[i]:indices[i+1]] for i in range(len(indices)-1)]
1tuwyuhd

1tuwyuhd8#

这是我的方法,如果输入是一个索引列表,在其上拆分数组:

#input
list1 = ['x','y','z','a','b','c','d','e','f','g']
split_points = [2,5,8] 

#split array on indices:
s = split_points+[len(list1)]  #must contain index beyond last element, alternatively use directly split_points.append(len(list1))
print([list1[i1:i2] for i1,i2 in zip([0]+s[:-1],s)])

>>> [['x', 'y'], ['z', 'a', 'b'], ['c', 'd', 'e'], ['f', 'g']]
qcbq4gxm

qcbq4gxm9#

2023年4月更新:谢谢你唐娜的评论!我做了一些改变,就像你建议的那样,但我认为这是一个非常简单的例子,可以更精确地了解它是如何工作的。
slice_in_N函数可能是一个更好的解决方案,对于非常长的序列,然后我看到的其他人,因为你切片的其余部分的序列,而不是整个了。
最好使用SequenceT而不是Sequence ',因为之后您可以根据Sequence-types 'list'或'tuple'(例如:附加到列表)

from collections.abc import Sequence
from typing import Iterable, TypeVar

SequenceT = TypeVar('SequenceT', bound=Sequence)

def slice_in_2(seq: SequenceT, index: int) -> tuple[SequenceT, SequenceT]:
    return seq[:index], seq[index:]

def slice_in_N(seq: SequenceT, indexes: Iterable[int]) -> list[SequenceT]:
    previous_i = 0
    result = []
    for i in indexes:
        seq2 = slice_in_2(seq, i-previous_i)
        result.append(seq2[0])
        seq = seq2[1]
        previous_i = i
    result.append(seq)
    return result

t = (1, 2, 3, 4, 5)
print(slice_in_2(t, 3)) # Output: ((1, 2, 3), (4, 5))
print(slice_in_N(t, (2,3))) # Output: [(1, 2), (3,), (4, 5)]

相关问题