切片列表的Pythonic方式w.r.t.元组中的第一个元素

时间:2016-03-27 22:03:42

标签: python tuples slice binary-search

我有一个表格

的元组的排序列表
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方式复制整个列表?

1 个答案:

答案 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

中找到详细信息