我有一个装满对象的列表,它们包含一个年龄的整数,我想获得另一个仅包含布尔值的列表。
每个布尔状态,如果object[i - 1]
比True
大False
,比object[i]
小,或者换句话说,我左边项目的age
大于还是小于我的。
例如:
ls = [obj1(age = 5), obj2(age = 16), obj3(age = 4)]
result = [False, True]
我正在寻找一个内置函数或精益方法来做到这一点,越短越好,最好是单线。
最简单的方法通常是使用zip
[a.age > b.age for a, b in zip(ls, ls[1:])]
如果有一个辅助函数pairs = lambda x: zip(x, x[1:])
,那很好,但是您始终可以自己定义它!
您可以通过列表理解来做到这一点:
[ls[i].age < ls[i - 1].age for i in range(1, len(ls))]
您也可以在列表理解中使用zip
:
[i[0].age > i[1].age for i in zip(ls, ls[1:])]
在执行精益方法之前,我总是会开始简单,易读和自我解释。lean很酷,但是您可能还希望在编写代码后的许多月就能了解您的情况。
class Obj:
def __init__(self, age):
self.age = age
ls = [Obj(age=5), Obj(age=16), Obj(age=4)]
result = []
for idx in range(1, len(ls)):
result.append(ls[idx-1].age > ls[idx].age)
如果简单的代码正常工作,您始终可以创建一个更智能的版本,但不要忘记,以后您应该能够理解您的代码。
如果您只是将for循环附加到结果上,则可以像其他人已经指出的那样将其转换为列表理解。
您将看到列表理解与上面的for循环相同,只是语法更加紧凑(并且您不必显式使用append)
[ls[idx-1] > ls[idx].age for idx in range(1, len(ls))]