循环和拆分对象



如何在对象上循环并通过"进行拆分:"进入单独的一个

{
labs:  [1,2,":",3,4],
level: [1,2,":",3,4]
}

预期输出:

{
labs:  [1,2],
level: [1,2]
}
{
labs:   [3,4],
level : [3,4]
}

您可以使用标准库中的itertools.groupby对非":"的数字进行分组。这样,您就可以使用zip来配对组。

from itertools import groupby
d = {
"labs":  [1,2,":",3,4],
"level": [10,20,":",30,40]
}
groups = [[(k, list(g)) for b, g in groupby(v, key=lambda n:n != ':') if b] 
for k, v in d.items()
]
list(map(dict, zip(*groups)))
# [
#     {'labs': [1, 2], 'level': [10, 20]}, 
#     {'labs': [3, 4], 'level': [30, 40]}
# ]

这应该适用于任意数据。例如,输入类似:

d = {
"labs":  [1,2,":",3,4,":", 5, 6],
"level": [10,20,":",30,40,":",50, 60],
"others":[-1,-2,":",-3,-4,":",-5,-6]
}

您将获得:

[{'labs': [1, 2], 'level': [10, 20], 'others': [-1, -2]},
{'labs': [3, 4], 'level': [30, 40], 'others': [-3, -4]},
{'labs': [5, 6], 'level': [50, 60], 'others': [-5, -6]}
]

但由于zip()的工作方式,它确实希望列表的长度相同。如果这不是一个好的假设,你需要决定如何处理不均衡的列表。在这种情况下,itertools.zip_lengest((可能会有所帮助。

使用javaScript来解决这个问题,也许代码不是最好的

const obj = {
labs:  [1,2,":",3,4,":",5,6],
level: [1,2,":",3,4,":",7,8],
others: [1,2,":",3,4,":",9,10]
}
const format = (obj = {}, result = []) => {
const keys = Object.keys(obj);
for ( key of keys) {
const itemValues = obj[key].toString().split(':');
let tempRes = {}
itemValues.map((itemValue, index) => {
Object.assign(tempRes, {
[`${keys[index]}`]: itemValue.replace(/^(,)+|(,)+$/g, '').split(',').map(Number)// you can format value here 
})
})
result.push(tempRes);
}
return result;
}
console.log(format(obj))

你会得到

[
{ labs: [ 1, 2 ], level: [ 3, 4 ], others: [ 5, 6 ] },
{ labs: [ 1, 2 ], level: [ 3, 4 ], others: [ 7, 8 ] },
{ labs: [ 1, 2 ], level: [ 3, 4 ], others: [ 9, 10 ] }
]

最新更新