TransWikia.com

Является ли решение хорошим с точки зрения "антикостыльности"?

Stack Overflow на русском Asked on October 30, 2020

Столкнулся с задачей: есть список комплексных чисес 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 Answers

Ну я бы вообще вот так написал:

distances = [abs(b - a) for b,a in zip(vertexes[1:],vertexes)]

Correct answer by CrazyElf on October 30, 2020

Я бы так делал:

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)

Answered by dIm0n on October 30, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP