Python 字典中按 value 合并,有没有简单的写法?

2020-08-26 19:53:23 +08:00
 css3

我太笨了,就是各种 for

把 tmp 按其 value 去重(取第一个), ret 为结果

tmp = {
    "a": [
        {"a1": "tom"},
        {"a2": "jery"},
        {"a3": "jery"},
        {"a4": "cao"},
        {"a5": "cao"},
    ],
    "b": [
        {"b1": "lily"},
        {"b2": "lily"},
        {"bn": "jack"},
    ]
}

ret = {
    "a": [
        {"a1": "tom"},
        {"a2": "jery"},
        {"a4": "cao"}
    ],
    "b": [
        {"b1": "lily"},
        {"bn": "jack"}
    ]
}

我自己半天写了这一坨,着实费劲,有没有简单的写法😭😭😭😭😭😭

_sort = {}
t = []
for k, v in tmp.items():
    _sort[k] = []
    for i in v:
        if list(i.values())[0] not in t:
            t.append(list(i.values())[0])
            _sort[k].append(i)
print(_sort)
2286 次点击
所在节点    Python
20 条回复
cyspy
2020-08-26 20:17:29 +08:00
反着放到 dict 里再取出来
lybcyd
2020-08-26 20:43:11 +08:00
如果不同的 key 有相同的 value,该保留哪一个呢?
css3
2020-08-26 21:02:54 +08:00
@lybcyd 就第一个吧
css3
2020-08-26 21:03:31 +08:00
测试了一下,我这一坨还有 bug😂
css3
2020-08-26 21:07:46 +08:00
@css3 就是不同 keykey 的 value 可以允许重复

tmp = {
"a": [
{"a1": "tom"},
{"a2": "jery"},
{"a3": "jery"},
{"a4": "cao"},
{"a5": "cao"},
],
"b": [
{"b1": "lily"},
{"b2": "lily"},
{"bn": "jack"},
{"bb": "tom"}
]
}

ret = {
"a": [
{"a1": "tom"},
{"a2": "jery"},
{"a4": "cao"}
],
"b": [
{"b1": "lily"},
{"bn": "jack"},
{"bb": "tom"}
]
}
ruyu
2020-08-26 21:08:43 +08:00
```py
[(k, [(n, m) for m, n in dict([reversed(next(iter(i.items()))) for i in v]).items()]) for k, v in tmp.items()]
```

这样?
ruyu
2020-08-26 21:11:09 +08:00
忘了转成 dict 了. 那就这样?

dict([(k, dict([(n, m) for m, n in dict([reversed(next(iter(i.items()))) for i in v]).items()])) for k, v in tmp.items()])
Death
2020-08-26 21:22:04 +08:00
平时 python 写的不多,试着写了一下

```
ret={key:list(reversed([{v:k} for k,v in {y:x for d in reversed(val) for x,y in d.items()}.items()])) for key,val in tmp.items()}
```
djFFFFF
2020-08-26 21:22:14 +08:00
这个结构太奇怪了,字典套列表再套只会有一个元素的字典是什么操作,字典套字典不行吗?
ipwx
2020-08-26 21:40:02 +08:00
其实楼主你有没有发现,一行写法更难读。。。

所以一步一步做是坠好的。
Trim21
2020-08-26 21:41:18 +08:00
封装成个函数用的时候也是一行(强行
BiteTheDust
2020-08-26 21:53:10 +08:00
应该反过来存储 合理存放数据结构很重要
billgreen1
2020-08-27 16:21:05 +08:00
[
{"a1": "tom"},
{"a2": "jery"},
{"a3": "jery"},
{"a4": "cao"},
{"a5": "cao"},
{"a6": "jery"},
],


这种情况如何处理?@楼主
css3
2020-08-27 19:49:11 +08:00
@css3 @cyspy @lybcyd @ruyu @Death @djFFFFF @ipwx @Trim21 @BiteTheDust @billgreen1
感谢各位,我等下挨个试试,嘿嘿
css3
2020-08-27 19:51:00 +08:00
@billgreen1
按里边字典的 value 去重就行,保留第一个
[
{"a1": "tom"},
{"a2": "jery"},
{"a4": "cao"},
],
skinny
2020-08-27 20:09:47 +08:00
不要在复杂数据结构和逻辑下写所谓的一行代码,看上去高大上,实际难读难以理解没卵用,先不提以后再读和维护时的酸爽,写的时候你也多浪费了很多脑细胞和时间。
ipwx
2020-08-28 09:45:53 +08:00
@skinny 我也是这个观点(如果是纯 python 处理代码)

但反过来,如果要处理几十万行几百万行这种,python 就超慢的,不得不诉诸于 pandas 那种。就会是另一种感觉了
zunsgm
2020-08-28 10:03:42 +08:00
@skinny
@ipwx
@ruyu
初学者,大佬们能分解下不?
ipwx
2020-08-28 10:32:43 +08:00
@zunsgm 你自己的那个版本改改不就行了?

wwf
2020-08-28 15:17:53 +08:00
def unpack(lst):
value_set = set()
new_lst = []
for i in lst:
for k, v in i.items():
if not value_set:
value_set.add(v)
new_lst.append(i)
if v in value_set:
continue
value_set.add(v)
new_lst.append(i)
return new_lst


ret = {}
for k, v in tmp.items():
ret[k] = unpack(v)

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

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

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

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

© 2021 V2EX