计算元组集合的平均距离的函数(Python)

3
我需要实现一个函数,从给定的点集中,指定两个整数对返回点之间的平均距离。如果点集中少于2个点,则会引发ValueError异常。 距离使用以下公式计算: d=sqrt((x1−x2)**2+(y1−y2)**2) 我正在努力让循环运行起来,但是它给了我一个错误,说types.Genericaliases没有len()方法。意识到这与输入为集合有关,但现在我不知道该如何解决:
def average_distance(points: set[tuple[int,int]]) -> float:



from math import sqrt
  
  points = list[input()]
  list_dist =[] 


for index in range(0, len(points)):
    coordinate = points[index] # tuple in the set points
    x1 = coordinate[0] # first el in the pair
    y1 = coordinate[1] # second el in the pair
    next_coordinate = points[index +1]
    x2 = next_coordinate[0]
    y2 = next_coordinate[1]
    
    distance = math.sqrt(((x1-x2)**2)+((y1-y2)**2))
    list_dist.append(distance)
  
  total_dist = 0
  for dist in distance:
    total_dist += dist 


avg_dist = total_dist//(len(distance))
  return avg_dist

So

print (average_distance({(1,2), (3,4), (5,6)}))

预期输出:

3.7712

希望你能就此提供建议。

非常感谢。


avg_dist = total_dist//(len(distance)) --> avg_dist = total_dist//(len(list_dist)) - balderman
2个回答

2

使用库更简洁的解决方案:

from statistics import mean
from math import dist
from itertools import combinations, starmap

def average_distance(points):
    return mean(starmap(dist, combinations(points, 2)))
    
print(average_distance({(1,2), (3,4), (5,6)}))

输出:

3.771236166328254

0

这是我实现的代码,可以计算给定顺序下每组两点之间的平均距离以及所有点的组合。请看一下。

from itertools import combinations
from math import sqrt
from typing import List, NamedTuple


class Point(NamedTuple):
    x: float
    y: float


def distance(p1: Point, p2: Point) -> float:
    return sqrt((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2)


def avg_dist_between_all_points(points: List[Point]) -> float:
    c = list(combinations(points, 2))
    return sum(distance(*pair) for pair in c) / len(c)


def avg_dist_between_seq_points(points: List[Point]) -> float:
    c = [points[i : i + 2] for i in range(len(points) - 1)]
    return sum(distance(*pair) for pair in c) / len(c)


if __name__ == "__main__":
    input_str = input("points (ex: 1,2 3,4 5,6): ")
    point_strs = input_str.split(" ")
    points: List[Point] = []
    for s in point_strs:
        x, y = s.split(",")
        points.append(Point(float(x), float(y)))
    print(avg_dist_between_all_points(points))
    print(avg_dist_between_seq_points(points))

这将产生:

➜ ./avgdist.py
points (ex: 1,2 3,4 5,6): 1,2 3,4 5,6
3.771236166328254
2.8284271247461903

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接