子集数据位于而不是

时间:2018-08-17 00:29:44

标签: python

假设我有此数据:

dat = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

,我想将向量abeginend的子集,以及向量bbeginend不包括的子集是值(不是索引)。

begin = 4
end = 7

我该怎么做?

所需的输出:

a = [ 4 5 6 7 ]
b = [ 1 2 3 8 9 10 ]

2 个答案:

答案 0 :(得分:3)

认为,您打算将这些beginend值用作列表中的值,而不是对其进行索引。 (尽管如果您的值不是单调增加看起来像索引的整数,那将会更加清楚……)

否则,您只需要dat[:begin] + dat[end:]dat[begin:end],但对于您的示例,这些值将是错误的-您显然不想从第4位开始,而是从第3位开始(值4)。


然后,我认为,您期望这些值按排序顺序排列,但这是一个疯狂的猜测。

如果是这样,您要做的就是在列表中找到beginend的位置。您可以通过手动遍历列表直到找到它们来做到这一点,但是请聪明一点,并使用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,以确保获得半开范围(即,“停止”索引不在范围内) ),即使您将beginend指定为封闭范围(也就是说,如果存在,则应该在输出中显示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:]

如果您将beginend作为数据(其中beginend是分开的),则只需查找元素的第一个位置即可:

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切片符号不包含在内。