Как перебрать список в python и получить логический список сравниваемых значений между каждыми двумя близкими элементами? - PullRequest
1 голос
/ 01 ноября 2019

У меня есть список объектов, и они содержат целое число для своего возраста, и я хочу получить еще один список, который содержит только логические значения.

Каждый логический параметр указывает, является ли object[i - 1] старше для True или младше для False, чем object[i], или, другими словами, age для элемента слева от меня больше или не больше моего.

Например:

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

Я ищу встроенную функцию или простой способ сделать это, чем короче, тем лучше, предпочтительно oneliner.

Ответы [ 4 ]

1 голос
/ 01 ноября 2019

Самым простым способом обычно является использование zip

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

Было бы неплохо, если бы была вспомогательная функция pairs = lambda x: zip(x, x[1:]), но вы всегда можете определить ее самостоятельно!

1 голос
/ 01 ноября 2019

Вы также можете использовать zip в понимании списка:

[i[0].age > i[1].age for i in zip(ls, ls[1:])]
1 голос
/ 01 ноября 2019

Вы можете сделать это через понимание списка:

[ls[i].age < ls[i - 1].age for i in range(1, len(ls))]
0 голосов
/ 01 ноября 2019

Я всегда начинал с простого, понятного и самообъяснимого, прежде чем делать тощий путь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, который добавляет результат, вы можете преобразовать его в понимание списка, как уже указали другие.

Вы увидите, что понимание списка такое же, как и выше для цикла loop, только с более компактным синтаксисом (и вам не нужно явно использовать append)

[ls[idx-1] > ls[idx].age for idx in range(1, len(ls))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...