停止列表选择?

发布于 2021-01-29 17:16:00

想象一下,我有一个元组的订单列表:

s = [(0,-1), (1,0), (2,-1), (3,0), (4,0), (5,-1), (6,0), (7,-1)]

给定一个参数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) )

然后在X和之间使用键选择元素E

R = [x for x in s if X <= x [0] < E]

这给了我我在R中想要的东西,但是它看起来效率很低,涉及两次表扫描。我可以在for循环中执行此操作,丢弃键过小的元组,并在碰到第一个阻塞元组时 中断
。但是与列表选择相比,像狗一样奔跑。

有一种超高效的python式(2.7)方法吗?

关注者
0
被浏览
48
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以简单地从列表中过滤出元组作为生成器表达式,然后在获取第二个元素为的第一个元组时停止从生成器表达式中获取值-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)]
    

    在这里,生成器表达式(item for item in s if item[0] >= X)将按需提供一个一个的值(它们不会一次全部生成,因此我们在这里节省了内存)大于或等于X

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看