我有一组字典需要进行缩放。为了使用sklearn的缩放器,我需要将这些字典转换成列表。然后,我会将列表再转换回字典。这是我目前的做法:
keys = sorted(X[0].keys())scaler = RobustScaler()transformed = scaler.fit_transform([[x[k] for k in keys] for x in X])X = [{k: x[idx] for idx, k in enumerate(keys)} for x in transformed]
有没有更简洁的方法呢?
回答:
我对这个问题的解决方案是这样的。它的做法与你的非常相似,只是最后一步使用了dict()
和zip()
,看起来更整洁(在我看来)。
X_original = [ {'a': 2, 'b': 3}, {'a': 7, 'b': 6}, {'a': 1, 'b': 7},]keys = sorted(X_original[0].keys())X_values = [ [d[k] for k in keys] for d in X_original]scaler = RobustScaler()X_transformed = scaler.fit_transform(X_values)X_final = [ dict(zip(keys, x)) for x in X_transformed]
检查这些变量显示结果是正确的:
>>> X_original[{'a': 2, 'b': 3}, {'a': 7, 'b': 6}, {'a': 1, 'b': 7}]>>> X_values[[2, 3], [7, 6], [1, 7]]>>> X_transformed[[ 0. -1.5 ] [ 1.66666667 0. ] [-0.33333333 0.5 ]]>>> X_final[{'a': 0.0, 'b': -1.5}, {'a': 1.6666666666666667, 'b': 0.0}, {'a': -0.3333333333333333, 'b': 0.5}]
你可能已经注意到我喜欢代码有间隔。如果你想要更紧凑的代码,那么它与你的代码仅在最后一行不同:
X_original = [ {'a': 2, 'b': 3}, {'a': 7, 'b': 6}, {'a': 1, 'b': 7},]keys = sorted(X_original[0].keys())scaler = RobustScaler()X_transformed = scaler.fit_transform([[d[k] for k in keys] for d in X_original])X_final = [dict(zip(keys, x)) for x in X_transformed]