python - 从字典列表中选择随机样本,具有值条件
问题描述
我有一个这样的字典列表:
list_of_dicts = [
{'db': 'redshift', 'table': 'metrics', 'prefix': 'abc_'},
{'db': 'blueshift', 'table': 'colors', 'prefix': 'abc_'},
{'db': 'orangeshift', 'table': 'people', 'prefix': 'def_'},
{'db': 'greenshift', 'table': 'money', 'prefix': 'def_'},
{'db': 'purpleshift', 'table': 'props', 'prefix': 'ghi_'},
{'db': 'brownshift', 'table': 'stages', 'prefix': 'ghi_'},
...
]
如何提取每个前缀的 N 个?例如,假设上面的列表很大,我想返回一个每个 prefix 有 5 个的 dicts 列表。所以我会得到一个包含 15 个字典、5 个带abc_
前缀的字典、5 个带def_
和 5 个带的列表ghi_
预期的输出将是:
result = [
{'db': 'redshift', 'table': 'metrics', 'prefix': 'abc_'},
{'db': 'blueshift', 'table': 'colors', 'prefix': 'abc_'},
{'db': 'orangeshift', 'table': 'people', 'prefix': 'abc_'},
{'db': 'greenshift', 'table': 'money', 'prefix': 'abc_'},
{'db': 'purpleshift', 'table': 'props', 'prefix': 'abc_'},
{'db': 'redshift', 'table': 'metrics', 'prefix': 'def_'},
{'db': 'blueshift', 'table': 'colors', 'prefix': 'def_'},
{'db': 'orangeshift', 'table': 'people', 'prefix': 'def_'},
{'db': 'greenshift', 'table': 'money', 'prefix': 'def_'},
{'db': 'purpleshift', 'table': 'props', 'prefix': 'def_'},
{'db': 'redshift', 'table': 'metrics', 'prefix': 'ghi_'},
{'db': 'blueshift', 'table': 'colors', 'prefix': 'ghi_'},
{'db': 'orangeshift', 'table': 'people', 'prefix': 'ghi_'},
{'db': 'greenshift', 'table': 'money', 'prefix': 'ghi_'},
{'db': 'purpleshift', 'table': 'props', 'prefix': 'ghi_'},
]
因此,从大量字典中随机提取了每个不同前缀的 5 个字典。
解决方案
将前缀值作为键的字典分组,并使用默认字典作为值列出。然后提取每个元素的 n 个元素(这里我从每个列表中抽取 2 个随机元素),如果需要,“展平”列表itertools.chain
import collections,random, itertools
list_of_dicts = [
{'db': 'redshift', 'table': 'metrics', 'prefix': 'abc_'},
{'db': 'blueshift', 'table': 'colors', 'prefix': 'abc_'},
{'db': 'orangeshift', 'table': 'people', 'prefix': 'def_'},
{'db': 'greenshift', 'table': 'money', 'prefix': 'def_'},
{'db': 'purpleshift', 'table': 'props', 'prefix': 'ghi_'},
{'db': 'brownshift', 'table': 'stages', 'prefix': 'ghi_'}
]
d = collections.defaultdict(list)
# group the dicts by prefix
for lst in list_of_dicts:
d[lst["prefix"]].append(lst)
# pick some dicts in each group & flatten the result
# a rare case where the keys aren't important in that step
result = list(itertools.chain.from_iterable(random.sample(v,2) for v in d.values()))
print(result)
一个输出:
[{'db': 'redshift', 'table': 'metrics', 'prefix': 'abc_'},
{'db': 'blueshift', 'table': 'colors', 'prefix': 'abc_'},
{'db': 'greenshift', 'table': 'money', 'prefix': 'def_'},
{'db': 'orangeshift', 'table': 'people', 'prefix': 'def_'},
{'db': 'brownshift', 'table': 'stages', 'prefix': 'ghi_'},
{'db': 'purpleshift', 'table': 'props', 'prefix': 'ghi_'}]
推荐阅读
- kubernetes - Kubernetes 中的 NetworkPolicy 在 podSelector 上不匹配
- ruby-on-rails - 如何在 order rails 查询中修复 sql 注入
- c# - 合并包含在分离实体中的 ICollection
- java - java - 如何使用正则表达式防止Java电子邮件字段中的重音字符?
- pip - 如何下载pyaudio
- node.js - npm 安装:500 错误
- python - 将数据从 Python 返回到 Unity 的问题
- c# - 荧光笔墨水笔触未渲染到画布控件上
- search - 在 Flutter 应用程序中搜索不同的 Firestore 集合
- php - 错误:Flutter web 中的 XMLHttpRequest 错误