我有这段代码:
x = [5, 8, 12]
y = 9
lower = [_ for _ in x if _ < y][-1]
higher = [_ for _ in x if _ > y][0]
print lower, higher
这会找到一个较低的值,以及一个高于列表x中给定输入(y)的值。 x已排序。
有更好的方法吗?
答案 0 :(得分:4)
由于x
已排序:
>>> bisect.bisect(x, y)
2
>>> x[:bisect.bisect(x, y)]
[5, 8]
>>> x[bisect.bisect(x, y):]
[12]
答案 1 :(得分:0)
也许你可以使用过滤器。
x = [5, 8, 12]
y = 9
lower = filter(lambda n:n<y, x)
higher = filter(lambda n:n>y, x)
print lower, higher
答案 2 :(得分:0)
如果您知道它已排序,则可以使用groupby from itertools
:
>>> x = [5, 8, 12]
>>> y = 9
>>> from itertools import groupby
>>> [list(group[1]) for group in groupby(x, lambda c: c < y)]
[[5, 8], [12]]
groupby
返回一个元组列表,格式为:(key_function_return_value, list-like iterable object)
。这就是为什么需要list(group[1])
才能将类似列表的对象明确地转换为列表。