Python使用多个元组的列表对列表进行切片

Python使用多个元组的列表对列表进行切片,python,list,tuples,slice,Python,List,Tuples,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_list = [ 5, 8, 3, 0, 0, 1, 3, 4, 8, 13, 0, 0, 0, 0, 21, 34, 25, 91,

我有一个数字列表,我想从多个元组列表中分割出数字的范围。例如,我有一个如下列表:

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_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_列表的值

可能性

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]

如果我理解正确,您希望返回
my_list
5:9
14: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]
您可以按如下方式使用内置的

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]]

您还可以将
slice
用于:


使用
starmap
,您可以任意向任何切片添加步骤参数:

>>> 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]]

这应该可以做到:

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

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

使用列表理解:

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]

您可以在列表中执行类似的操作

slices = [my_list[x:y] for x, y in my_tups if x < len(my_list) and y < len(my_list)]
slices=[my_list[x:y]表示x,如果x
这似乎是最简单、最合理的解决方案me@Chris_Rands及fastest@Kate你是说[0,0,0,0,0,1,3,4,8,13,0,0,0,0,21,34,25,91,0,0,0,0](结尾是3个零而不是2)?是的,我忘了加一个这很好,谢谢!有没有办法返回数字周围填有零的列表?最后的结果是[0,0,0,0,0,1,3,4,8,13,0,0,0,0,0,21,34,25,91,61,0,0]但是你应该把它作为一个新问题来问