停止列表选择?

Ter*_*ole 14 python list python-2.7

想象一下,我有一个元组的顺序列表:

s = [(0,-1), (1,0), (2,-1), (3,0), (4,0), (5,-1), (6,0), (7,-1)]
Run Code Online (Sandbox Code Playgroud)

给定一个参数X,我想选择所有第一个元素等于或大于X但不包括第一个元组的元组,第一个元组具有-1作为第二个元素.

例如,如果X = 3,我想选择列表[(3,0), (4,0)]

我的一个想法是:获取切断键

E = min (x [0] for x in s if (x [0] >= X) and (x [1] == -1) )
Run Code Online (Sandbox Code Playgroud)

然后在X和之间选择带键的元素E:

R = [x for x in s if X <= x [0] < E]
Run Code Online (Sandbox Code Playgroud)

这给了我在R中想要的东西,但它似乎效率很低,涉及两次表扫描.我可以在for循环中执行它,丢弃键太小的元组,并在我击中第一个阻塞元组时中断.但对于像狗一样的跑步与列表选择相比.

这样做是否有超高效,python-esque(2.7)方式?

the*_*eye 28

您可以简单地从列表中过滤元组作为生成器表达式,然后当您获得第二个元素的第一个元组时,您可以停止从生成器表达式中获取值-1,如下所示

>>> s = [(0,-1), (1,0), (2,-1), (3,0), (4,0), (5,-1), (6,0), (7,-1)]
>>> from itertools import takewhile
>>> X = 3
>>> list(takewhile(lambda x: x[1] != -1, (item for item in s if item[0] >= X)))
[(3, 0), (4, 0)]
Run Code Online (Sandbox Code Playgroud)

在这里,生成器表达式(item for item in s if item[0] >= X)将根据需要一个接一个地给出值(它们不是一次全部生成,因此我们在这里保存内存)大于或等于X.

然后,我们把值从发电机的表情,只是直到我们找到一个元组第二个元素不等于-1itertools.takewhile.

  • 你的回答优雅地满足了我的每一个顾虑.我高兴地哭泣. (10认同)