如何根据索引范围将列表拆分为子列表?例如,原始列表:
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]
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']
注意你可以用正数或负数来切片,当你用负数时,意味着我们从右向左切片。
a6b3iqyw2#
请注意,您可以在切片中使用变量:
l = ['a',' b',' c',' d',' e'] c_index = l.index("c") l2 = l[:c_index]
这将把l的前两个条目放在l2中
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以使范围包含...
gjmwrych4#
list1a=list[:5] list1b=list[5:]
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]
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:]
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)]
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']]
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)]
9条答案
按热度按时间3zwtqj6y1#
在Python中,它被称为切片。下面是python's slice notation的示例:
注意你可以用正数或负数来切片,当你用负数时,意味着我们从右向左切片。
a6b3iqyw2#
请注意,您可以在切片中使用变量:
这将把l的前两个条目放在l2中
afdcj2ne3#
如果你已经知道指数:
请注意,我们在末尾添加+1以使范围包含...
gjmwrych4#
kxeu7u2r5#
如果您有多个索引或知道需要获取的索引范围,则可以使用以下方法之一:
split_points -拆分字符串或列表的点
k -需要分割的范围,例如= 3
sirbozc56#
fcipmucu7#
考虑以下示例的核心伪代码:
1tuwyuhd8#
这是我的方法,如果输入是一个索引列表,在其上拆分数组:
qcbq4gxm9#
2023年4月更新:谢谢你唐娜的评论!我做了一些改变,就像你建议的那样,但我认为这是一个非常简单的例子,可以更精确地了解它是如何工作的。
slice_in_N函数可能是一个更好的解决方案,对于非常长的序列,然后我看到的其他人,因为你切片的其余部分的序列,而不是整个了。
最好使用SequenceT而不是Sequence ',因为之后您可以根据Sequence-types 'list'或'tuple'(例如:附加到列表)