我有一个表格
的元组的排序列表x =
[(0,1), (0,2), (0,3), ...
(1,1), (1,3), (1,4), ...
...
(n,0), (n,4), ...
]
我想要对列表进行切片,使得所有数字的(x,y),其中x是新列表中的特定值,并保留顺序。现在,这显然会奏效:
y = [(a,b) for (a,b) in x if a == n]
但它确实很慢。使用二进制搜索找到满足此条件的第一个和最后一个索引会更快。 index
为您提供值的第一个索引,反转列表的index
将给出最后一个索引。如何在不进行[a for (a,b) in x]
的情况下应用它并以pythonic方式复制整个列表?
答案 0 :(得分:2)
如@Liongold的评论所示,您可以使用bisect。假设您希望所有元组t
都带有t[0] == 1
:
from bisect import bisect_left
x = [(0, 1), (0, 2), (1, 1), (1, 2), (2, 1), (2, 2)]
start = bisect_left(x, (1, None)) # index of the very first (1, i)
end = bisect_left(x, (2, None)) # index after the very last (1, i)
y = x[start:end]
# y: [(1, 1), (1, 2)]
您可以在bisect docs。
中找到详细信息