以下代码从日期值的有序列表中获取最后一个当前值:
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方式来实现这一目标?
答案 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 n
非None
值 - 例如,取最后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)
将各个步骤考虑在内可能会很好:
您想要第二列(x[1]
)
def column(data, index): return [x[index] for x in data]
您想要过滤掉None
def notNone(data): return [x for x in data if x is not None]
您想要最后一个元素
def last(data): return data[-1]
然后你的问题就变成了
last_preset_value = last(notNone(column(data, 1)))