我有大量的多维数组数据,其最基本的看起来像这样:
[
{
'a': 'a1',
'b': [
{
'ba': 'ba1',
'bb': 1,
'bc': {
'bca': 'bca1',
'bcb': 4
}
},
{
'ba': 'ba2',
'bb': 2,
'bc': {
'bca': 'bca2',
'bcb': 5
}
},
{
'ba': 'ba3',
'bb': 3,
'bc': {
'bca': 'bca3',
'bcb': 6
}
}
]
},
...
]
我想要做的是标准化顶级数组中每个对象内的“bb”和“bcb”值。
也就是说,我想以这样的方式结束:
[
{
'a': 'a1',
'b': [
{
'ba': 'ba1',
'bb': 0,
'bc': {
'bca': 'bca1',
'bcb': 0
}
},
{
'ba': 'ba2',
'bb': 0.5,
'bc': {
'bca': 'bca2',
'bcb': 0.5
}
},
{
'ba': 'ba3',
'bb': 1,
'bc': {
'bca': 'bca3',
'bcb': 1
}
}
]
},
...
]
是否有一个包或类似的包可以在 python 中执行此操作?
显然我可以用一个复杂的循环来做到这一点,但我想知道是否有更有效的方法来做到这一点?
您可以定义一个函数来执行此操作:
下面的函数从字典中提取值,对值进行标准化并替换原始值。第二个功能(不需要以漂亮的方式打印,它只是装饰):
import numpy as np
import json
def normalize_data(data):
for obj in data:
bb_values = [item['bb'] for item in obj['b']]
bcb_values = [item['bc']['bcb'] for item in obj['b']]
bb_min, bb_max = min(bb_values), max(bb_values)
bcb_min, bcb_max = min(bcb_values), max(bcb_values)
normalized_bb = [(bb - bb_min) / (bb_max - bb_min) if bb_max > bb_min else 0 for bb in bb_values]
normalized_bcb = [(bcb - bcb_min) / (bcb_max - bcb_min) if bcb_max > bcb_min else 0 for bcb in bcb_values]
for i, item in enumerate(obj['b']):
item['bb'] = normalized_bb[i]
item['bc']['bcb'] = normalized_bcb[i]
return data
data = [
{
'a': 'a1',
'b': [
{'ba': 'ba1', 'bb': 1, 'bc': {'bca': 'bca1', 'bcb': 4}},
{'ba': 'ba2', 'bb': 2, 'bc': {'bca': 'bca2', 'bcb': 5}},
{'ba': 'ba3', 'bb': 3, 'bc': {'bca': 'bca3', 'bcb': 6}}
]
}
]
normalized_data = normalize_data(data)
def print_nicely_formatted_output(data):
formatted_data = json.dumps(data, indent=4)
print(formatted_data)
print_nicely_formatted_output(normalized_data)
这给了你
[
{
"a": "a1",
"b": [
{
"ba": "ba1",
"bb": 0.0,
"bc": {
"bca": "bca1",
"bcb": 0.0
}
},
{
"ba": "ba2",
"bb": 0.5,
"bc": {
"bca": "bca2",
"bcb": 0.5
}
},
{
"ba": "ba3",
"bb": 1.0,
"bc": {
"bca": "bca3",
"bcb": 1.0
}
}
]
}
]