如何遍历 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
大或 False
比 object[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:])
,但是你总是可以自己定义它!
我有一个充满对象的列表,它们包含一个代表其年龄的整数,我想获得另一个仅包含布尔值的列表。
每个布尔值状态,如果 object[i - 1]
比 True
大或 False
比 object[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:])
,但是你总是可以自己定义它!