如何遍历 python 中的列表并获取每两个相近项之间的比较值的布尔列表?

How to iterate over a list in python and get a booleans list of the compared values between each two close items?

我有一个充满对象的列表,它们包含一个代表其年龄的整数,我想获得另一个仅包含布尔值的列表。

每个布尔值状态,如果 object[i - 1]True 大或 Falseobject[i] 小,或者换句话说,age 到我左边的项目是否比我的大。

例如:

ls = [obj1(age = 5), obj2(age = 16), obj3(age = 4)]
result = [False, True]

我正在寻找内置函数或精益方法,越短越好,最好是 oneliner。

您可以通过列表理解来做到这一点:

[ls[i].age < ls[i - 1].age for i in range(1, len(ls))]

在采用精益方法之前,我总是从简单、可读和自我解释开始。 精益很酷,但您可能希望在编写代码几个月后也能理解您的能力。

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))]

您还可以在列表理解中使用 zip

[i[0].age > i[1].age for i in zip(ls, ls[1:])]

最简单的方法通常是使用 zip

[a.age > b.age for a, b in zip(ls, ls[1:])]

如果有一个辅助函数就好了pairs = lambda x: zip(x, x[1:]),但是你总是可以自己定义它!