【发布时间】:2016-07-15 04:10:09
【问题描述】:
我有一个形式为元组的排序列表
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 方式复制整个列表,如何应用它?
【问题讨论】:
-
由于它不能假设 有序 列表,
index可能不会进行二进制搜索,而是进行列表遍历,所以我怀疑这会更快。 -
考虑使用bisect,这是处理排序列表的首选方式。
-
至于在知道开始和结束位置后访问列表中的子范围(切片):请参阅 stackoverflow.com/questions/509211/… 甚至只是 docs.python.org/2/tutorial/introduction.html#strings
标签: python tuples slice binary-search