现在有一个 list, 每个元素都是一个 dict, 像下面这样
[
{
"labels": {
"k_1": "v_1",
"k_2": "v_2",
"k_3": "v_3_1"
}
},
{
"labels": {
"k_1": "v_1",
"k_2": "v_2",
"k_3": "v_3_2"
}
},
......
]
现在想要把其中 k_1 和 k_2 的 value 相同的, 但 k_3 的 value 不同的, 拿出来, 变成下面这样
[
{
"labels": {
"k_1": "v_1",
"k_2": "v_2"
},
"targets": ["v_3_1", "v_3_2"]
},
......
]
有什么快速的算法吗?
1
imn1 2021-03-13 17:01:14 +08:00
应该好多人不知道这种写法
d1.items() & d2.items() d1.items() - d2.items() d2.items() - d1.items() keys()也可以这样写,但 values()不行 |
2
no1xsyzy 2021-03-14 21:34:00 +08:00 1
用 (d['labels']['k_1'], d['labels']['k_2']) 为 key 重建一个新的 dict,然后再构造成新的
这个似乎是 O(n + m),其中 n 是原列表的长度,m 是新列表的长度。特别地,当 m 比较小的时候复杂度是 O(nm),随着 m 增大到某一数值就会变成 O(n + m),此时中间形态的 dict 的实现方式(自动地)从 k-v array 转为 hash map 。 |
4
HelloViper 2021-03-15 15:54:09 +08:00
temp = {}
for x in data: temp[(x['labels']['k_1'], x['labels']['k_2'])] = [*temp.get((x['labels']['k_1'], x['labels']['k_2']),[]), x['labels']['k_3']] |
5
plko345 OP @HelloViper 可是每个 dict 中的 k_1 和 k_2 的 value 并不总是相同的
|
6
plko345 OP @HelloViper 抱歉, 我没写清楚, labels 中存在 n 个元素, 即 k_n
|
7
HelloViper 2021-03-16 10:36:29 +08:00 1
@plko345 你干脆转 pandas 随便玩吧,想怎么 groupby 都行,吧要聚合的列 apply list
|
8
zyb201314 2021-03-16 14:10:54 +08:00 via Android
#竟然没人用一楼方案?
data = [ { "labels": { "k_1": "v_1", "k_2": "v_2", "k_3": "v_3_1" } }, { "labels": { "k_1": "v_1", "k_2": "v_2", "k_3": "v_3_2" } } ] ################################ label_name = next((next((j for j in i)) for i in data)) labels = data[0][label_name] #获取第一个 labels 的字典. targets = {} ################################ for d in data: for j in d: labels = dict(labels.items() & d[j].items()) targets = dict(targets.items() ^ d[j].items()) ################################ data=[{str(label_name): labels},{'targets': targets}] print(data) |
9
HelloViper 2021-03-16 17:23:59 +08:00
@zyb201314 还可以|,经典的 sum dict:
def _sum_dict(a, b): temp = dict() for key in a.keys() | b.keys(): temp[key] = sum([d.get(key, 0) for d in (a, b)]) return temp |