题解 | 用户分群
用户分群
https://www.nowcoder.com/practice/ba24c14adb424bd2b4888c70ddfe9568
import math
def k_means_fast(K, R, M, centers, data):
for _ in range(R):
# 1. 初始化 K 个簇的容器
groups = [[] for _ in range(K)]
# 2. 遍历每个数据点,直接分配到最近的簇
for point in data:
# 利用列表推导式计算点到所有中心的距离,并用 min 找出最小距离对应的索引
distances = [math.dist(point, c) for c in centers]
closest_idx = distances.index(min(distances))
groups[closest_idx].append(point)
# 3. 重新计算中心点
for i in range(K):
if not groups[i]:
continue # 如果该簇没有分配到点,保持原中心不变
# 核心技巧:zip(*groups[i]) 会把所有点的第0维、第1维...分别打包
# 例如点是 [[1,2,3], [4,5,6]] -> zip后变成 [(1,4), (2,5), (3,6)]
centers[i] = [sum(dim) / len(groups[i]) for dim in zip(*groups[i])]
return centers
if __name__ == "__main__":
K = int(input())
centers = [[float(x) for x in input().split()] for _ in range(K)]
R = int(input())
M = int(input())
data = [[float(x) for x in input().split()] for _ in range(M)]
res = k_means_fast(K, R, M, centers, data)
for row in res:
print(" ".join(f"{val:.2f}" for val in row))
查看3道真题和解析