假设我有此数据:
dat = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
,我想将向量a
从begin
到end
的子集,以及向量b
从begin
到end
不包括的子集是值(不是索引)。
begin = 4
end = 7
我该怎么做?
所需的输出:
a = [ 4 5 6 7 ]
b = [ 1 2 3 8 9 10 ]
答案 0 :(得分:3)
我认为,您打算将这些begin
和end
值用作列表中的值,而不是对其进行索引。 (尽管如果您的值不是单调增加看起来像索引的整数,那将会更加清楚……)
否则,您只需要dat[:begin] + dat[end:]
和dat[begin:end]
,但对于您的示例,这些值将是错误的-您显然不想从第4位开始,而是从第3位开始(值4)。
然后,我认为,您期望这些值按排序顺序排列,但这是一个疯狂的猜测。
如果是这样,您要做的就是在列表中找到begin
和end
的位置。您可以通过手动遍历列表直到找到它们来做到这一点,但是请聪明一点,并使用bisect
库:
beginpos = bisect.bisect_left(dat, begin)
endpos = bisect.bisect_right(dat, end)
outside = dat[:beginpos] + dat[endpos:]
inside = dat[beginpos:endpos]
请注意,我在左侧使用了bisect_left
,在右侧使用了bisect_right
,以确保获得半开范围(即,“停止”索引不在范围内) ),即使您将begin
和end
指定为封闭范围(也就是说,如果存在,则应该在输出中显示7)。
如果它们不是 排序的,那么这个问题就模棱两可。列表中可能有4-7之间的多个范围。它们甚至可能重叠。因此,您需要在解决问题之前更好地指定问题。但是也许您只想说4 <= value <= 7
中的所有值,而根本不考虑范围?很简单:
outside = [value for value in dat if not 4 <= value <= 7]
inside = [value for value in dat if 4 <= value <= 7]
答案 1 :(得分:1)
您将要使用切片符号。
a = dat[begin-1:end]
b = dat[:begin-1] + dat[end:]
如果您将begin
和end
作为数据(其中begin
和end
是分开的),则只需查找元素的第一个位置即可:
start_ind = dat.index(4)
stop_ind = dat.index(7)
a = dat[start_ind:stop_ind+1]
b = date[:start_ind] + dat[stop_ind+1:]
如果您的元素已排序,请使用bisect.bisect()
而不是index()
。如果您有重复项/重叠项,则必须在问题中更加具体。
请记住,[start:stop:step]
中的stop
切片符号不包含在内。