2016-09-21 31 views
1

我有一个数字列表,我想对从多个元组列表中给出的数字范围进行切片。例如,我有一个列表,看起来像:Python使用多个元组列表对一个列表进行切片

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_list的值?

回答

0

的可能性

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

这很好,谢谢!有没有办法在数字周围填充零来返回列表?所以最后的结果是[0,0,0,0,0,1,3,4,8,13,0,0,0,0,21,34,25,91,61,0,0] – Kate

0

如果我理解正确的问题,你想从my_list的范围5:914: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] 
1

您可以使用内置的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_list2 = [my_list[slice(*o)] for o in my_tups] 
print(my_list2) 

>>> [[1, 3, 4, 8], [21, 34, 25, 91]] 
0

你也可以使用sliceitertools.starmap

from itertools import starmap 

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

result = [my_list[slc] for slc in starmap(slice, my_tups)] 
# [[1.0, 3.0, 4.0, 8.0], [21.0, 34.0, 25.0, 91.0]] 

随着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]] 
+0

你应该问,作为一个新的问题 –

0

这应该做的伎俩:

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

除了打印,你可以做别的事情与列表中。

3

使用列表理解:

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

这似乎是最简单和合乎逻辑的解决方案 –

+1

@Chris_Rands和最快 – Wondercricket

+0

@凯特你的意思是[0,0,0,0,0,1,3,4,8,13 ,0,0,0,0,21,34,25,91,0,0,0](3个零而不是2个)? –

0

你可以做这样的事情在一个列表理解

slices = [my_list[x:y] for x, y in my_tups if x < len(my_list) and y < len(my_list)]