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

问题描述 投票:1回答:4

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

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

例如:

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

我正在寻找一个内置函数或精益方法来做到这一点,越短越好,最好是单线。

python python-2.7 list built-in
4个回答
1
投票

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

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

如果有一个辅助函数pairs = lambda x: zip(x, x[1:]),那很好,但是您始终可以自己定义它!


1
投票

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

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

1
投票

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

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

0
投票

在执行精益方法之前,我总是会开始简单,易读和自我解释。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))]
© www.soinside.com 2019 - 2024. All rights reserved.