什么是从列表中获取最后一个非-On值的Pythonic方法

时间:2015-02-27 20:50:26

标签: python python-2.7

以下代码从日期值的有序列表中获取最后一个当前值:

def test_get_last_value(self):
    dated_optional_values = [(datetime.datetime(2015, 2, 23), None),
                    (datetime.datetime(2015, 2, 24), 1.23),
                    (datetime.datetime(2015, 2, 25), None),
                    (datetime.datetime(2015, 2, 26), 2.34),
                    (datetime.datetime(2015, 2, 27), None),
                    ]
    present_values = [dated_optional_value[1] for dated_optional_value in dated_optional_values
        if dated_optional_value[1] is not None]
    last_present_value = present_values[-1]
    print('last_present_value=', last_present_value)

我可以轻松编写一个从列表末尾开始并循环的循环,直到找到一个值。

是否有更多的Pythonic方式来实现这一目标?

4 个答案:

答案 0 :(得分:3)

也许:

last_present_value = next(x for x in reversed(dated_optional_values) 
                          if x[1] is not None)

答案 1 :(得分:3)

next((dop[1] for dop in reversed(date_optional_values) if dop[1] is not None), None)

您可以将最后的None替换为您喜欢的任何其他值,以返回每个值为None的情况。或者省略该参数,以便在它们都是None的情况下抛出异常。

答案 2 :(得分:0)

您也可以将此概括为last nNone值 - 例如,取最后2个非空格:

from itertools import islice

candidates = (el[1] for el in reversed(dated_optional_values) if el[1] is not None)
last_n = list(islice(candidates, 2)) or []

此外,如果您没有Sized容器(例如列表)并且具有一些任意可迭代容器,则可以使用具有固定大小的collections.deque,例如:

from collections import deque

candidates = (el[1] for el in dated_optional_values if el[1] is not None)
d = deque([], 2)
d.extendleft(candidates)
matches = list(d) or []

这两个选项都会返回:

[2.34, 1.23]

答案 3 :(得分:0)

将各个步骤考虑在内可能会很好:

  1. 您想要第二列(x[1]

    def column(data, index): return [x[index] for x in data]

  2. 您想要过滤掉None

    def notNone(data): return [x for x in data if x is not None]

  3. 您想要最后一个元素

    def last(data): return data[-1]

  4. 然后你的问题就变成了

    last_preset_value = last(notNone(column(data, 1)))
    
相关问题