python - 在python字典中按值分组键/值对,保持原始键关联
问题描述
寻找一种有效的方法来根据它们的相似性对字典中的值进行分组,从而产生一个反向字典,其中原始键被分组为一个列表。我可以想到一些笨拙的方法来做到这一点,但对其他方法很感兴趣。
假设我的字典如下所示:
{'d1': {'goober': True, 'horse': 42},
'd2': {'goober': True, 'horse': 42},
'd3': {'goober': False, 'horse': 71}}
我想要的字典可能如下所示:
{'group1': {'dict': {'goober': True, 'horse': 42}, 'keys': ['d1', 'd2']},
'group2': {'dict': {'goober': False, 'horse': 71}, 'keys': ['d3']}}
重要的细节是原始键d1
和d2
已被分组在一个任意命名的 下group1
,由原始字典中的相同字典分组。维护原始键 -d1
并d2
存储在keys
列表中 - 以及它们关联的字典也很重要。 d3
是唯一的,因为它的字典是独一无二的。
我更大的目标是获取包含用于其他目的的参数的字典字典,但将它们分组到参数相同的位置,这样我可以更有效率并将它们一起运行。
任何提示或建议将不胜感激!
解决方案
这是可能的,但对于普通的 Python 来说很乏味。如果您愿意使用 3rd 方库,可以使用 Pandas 执行GroupBy
聚合:
import pandas as pd
d = {'d1': {'goober': True, 'horse': 42},
'd2': {'goober': True, 'horse': 42},
'd3': {'goober': False, 'horse': 71}}
df = pd.DataFrame(d).T.reset_index().groupby('goober')\
.agg(lambda x: set(x)).reset_index()
print(df)
# goober index horse
# 0 False {d3} {71}
# 1 True {d1, d2} {42}
res = [{'dict': {'goober': row.goober, 'horse': next(iter(row.horse))},
'keys': list(row.index)} for row in df.itertuples(index=False)]
结果:
[{'dict': {'goober': False, 'horse': 71}, 'keys': ['d3']},
{'dict': {'goober': True, 'horse': 42}, 'keys': ['d1', 'd2']}]
注意我没有应用任何逻辑来派生'group1'
和'group2'
外部字典键。目前尚不清楚这些是如何得出的。如果它们是任意标识符,您可以enumerate
在后续步骤中使用:
res2 = {f'group{idx}': d for idx, d in enumerate(res, 1)}
结果:
{'group1': {'dict': {'goober': False, 'horse': 71}, 'keys': ['d3']},
'group2': {'dict': {'goober': True, 'horse': 42}, 'keys': ['d1', 'd2']}}
推荐阅读
- html - how to change the font size of the text on my button (HTML/CSS)
- unix - Groovy:如何获取某个日期的 unix 时间而不是当前日期?
- python - 一旦精灵接触到墙壁,你将如何结束循环?
- html - 使用隐藏元素进行过渡
- kubernetes - 在 Kubernetes 的 Prometheus 中自动生成警报规则?
- makefile - 命令未在 Makefile 的字符串插值内运行
- jquery - 将对象数组转换为对象值的数组
- date - 使用 ISO 8601 表示法创建自定义 SAS 日期时间格式
- swift - How to set the initial view to have navigation bar back button SwiftUI
- c++ - How to find cyrillic word in text