请教一个 dict 中取相同 value 的方法

2021-03-13 16:52:13 +08:00
 plko345

现在有一个 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"]
    },
    ......
]

有什么快速的算法吗?

1956 次点击
所在节点    Python
9 条回复
imn1
2021-03-13 17:01:14 +08:00
应该好多人不知道这种写法
d1.items() & d2.items()
d1.items() - d2.items()
d2.items() - d1.items()

keys()也可以这样写,但 values()不行
no1xsyzy
2021-03-14 21:34:00 +08:00
用 (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 。
plko345
2021-03-15 10:44:58 +08:00
@no1xsyzy 感谢,我试试
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']]
plko345
2021-03-15 22:45:37 +08:00
@HelloViper 可是每个 dict 中的 k_1 和 k_2 的 value 并不总是相同的
plko345
2021-03-15 22:46:54 +08:00
@HelloViper 抱歉, 我没写清楚, labels 中存在 n 个元素, 即 k_n
HelloViper
2021-03-16 10:36:29 +08:00
@plko345 你干脆转 pandas 随便玩吧,想怎么 groupby 都行,吧要聚合的列 apply list
zyb201314
2021-03-16 14:10:54 +08:00
#竟然没人用一楼方案?
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)
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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/761328

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX