如何从 json defaultdict 中删除重复项?
how to remove duplicates from a json defaultdict?
(Re-post 具有准确的数据样本)
我有一个 json 字典,其中每个值依次是一个 defaultdict,如下所示:
"Parent_Key_A": [{"a": 1.0, "b": 2.0}, {"a": 5.1, "c": 10}, {"b": 20.3, "a": 1.0}]
我正在尝试删除重复的键和值,以便 json 的每个元素都具有唯一值。所以对于上面的例子,我正在寻找这样的输出:
"Parent_Key_A": {"a":[1.0,5.1], "b":[2.0,20.3], "c":[10]}
然后我需要将此输出写入 json 文件。我尝试使用 set 来处理重复项,但 set 不是 json 可序列化的。
关于如何处理这个问题有什么建议吗?
使用itertools.chain()
和itertools.groupby()
函数的解决方案:
import itertools, json
input_d = { "Parent_Key_A": [{"a": 1.0, "b": 2.0}, {"a": 5.1, "c": 10}, {"b": 20.3, "a": 1.0}] }
items = itertools.chain.from_iterable(list(d.items()) for d in input_d["Parent_Key_A"])
# dict comprehension (updated syntax here)
input_d["Parent_Key_A"] = { k:[i[1] for i in sorted(set(g))]
for k,g in itertools.groupby(sorted(items), key=lambda x: x[0]) }
print(input_d)
输出:
{'Parent_Key_A': {'a': [1.0, 5.1], 'b': [2.0, 20.3], 'c': [10]}}
正在打印到 json 文件:
json.dump(input_d, open('output.json', 'w+'), indent=4)
output.json
内容:
{
"Parent_Key_A": {
"a": [
1.0,
5.1
],
"c": [
10
],
"b": [
2.0,
20.3
]
}
}
(Re-post 具有准确的数据样本)
我有一个 json 字典,其中每个值依次是一个 defaultdict,如下所示:
"Parent_Key_A": [{"a": 1.0, "b": 2.0}, {"a": 5.1, "c": 10}, {"b": 20.3, "a": 1.0}] 我正在尝试删除重复的键和值,以便 json 的每个元素都具有唯一值。所以对于上面的例子,我正在寻找这样的输出:
"Parent_Key_A": {"a":[1.0,5.1], "b":[2.0,20.3], "c":[10]} 然后我需要将此输出写入 json 文件。我尝试使用 set 来处理重复项,但 set 不是 json 可序列化的。
关于如何处理这个问题有什么建议吗?
使用itertools.chain()
和itertools.groupby()
函数的解决方案:
import itertools, json
input_d = { "Parent_Key_A": [{"a": 1.0, "b": 2.0}, {"a": 5.1, "c": 10}, {"b": 20.3, "a": 1.0}] }
items = itertools.chain.from_iterable(list(d.items()) for d in input_d["Parent_Key_A"])
# dict comprehension (updated syntax here)
input_d["Parent_Key_A"] = { k:[i[1] for i in sorted(set(g))]
for k,g in itertools.groupby(sorted(items), key=lambda x: x[0]) }
print(input_d)
输出:
{'Parent_Key_A': {'a': [1.0, 5.1], 'b': [2.0, 20.3], 'c': [10]}}
正在打印到 json 文件:
json.dump(input_d, open('output.json', 'w+'), indent=4)
output.json
内容:
{
"Parent_Key_A": {
"a": [
1.0,
5.1
],
"c": [
10
],
"b": [
2.0,
20.3
]
}
}