Является ли решение хорошим с точки зрения "антикостыльности"?
Столкнулся с задачей: есть список комплексных чисес vertexes = [v0, v1, ..., vn], необходимо получить список distances = [d0, d1, ..., ], причём distances[i] = abs(vertexes[i + 1] - vertexes[i])
Например, vertexes = [1 + 0j, 3 + 0j, 3 + 4j, 6 + 8j] => distances = [2, 4, 5]
Моё решение:
import functools
def calculate_distances(vertexes):
distances = []
functools.reduce(lambda a, b: distances.append(abs(b - a)) or b, vertexes)
return distances
vertexes = [1 + 0j, 3 + 0j, 3 + 4j, 6 + 8j]
distances = calculate_distances(vertexes)
print(distances)
# Out: [2.0, 4.0, 5.0]
Стоит ли писать такой код? Может есть решение изящнее или правильнее или (изящнее и правильнее)? После такого у меня остаётся ужасное послевкусие костыльности. Так ли это на самом деле?
Ответы (2 шт):
Автор решения: dIm0n
→ Ссылка
Я бы так делал:
import itertools
def pairwise(iterable):
a, b = itertools.tee(iterable)
next(b, None)
return zip(a, b)
def calculate_distances(vertexes):
return [abs(b - a) for a, b in pairwise(vertexes)]
vertexes = [1 + 0j, 3 + 0j, 3 + 4j, 6 + 8j]
distances = calculate_distances(vertexes)
print(distances)
Автор решения: CrazyElf
→ Ссылка
Ну я бы вообще вот так написал:
distances = [abs(b - a) for b,a in zip(vertexes[1:],vertexes)]