【问题标题】:Pythonic way of slicing a list w.r.t. first element in tuplePythonic 切片列表的方式 w.r.t.元组中的第一个元素
【发布时间】: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 方式复制整个列表,如何应用它?

【问题讨论】:

标签: python tuples slice binary-search


【解决方案1】:

正如@Liongold 在 cmets 中所建议的,您可以使用 bisect。假设您想要所有元组 tt[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找到详细信息。

【讨论】:

  • 如果我不能假设 2 在列表中怎么办?
  • bisect_left(x, (2, None) 将返回所提供元素的插入点。由于None < i 用于任何整数i,这应该始终返回最后一个(1, i) 之后的精确索引。如有必要,可以是len(x)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 2019-04-19
  • 2014-05-21
相关资源
最近更新 更多