我有一个数组,它包含几种类型dict,例如:
arr = [
{'type': 'employee.update', ...},
{'type': 'job.started', ...},
{'type': 'meeting.xpto', ...}
...
]
如何按类型前缀拆分“main”数组? 是否需要为每个前缀迭代整个数组?
employess_actions = list(filter(lambda x: x['type'].startswith('employee.'), arr))
job_actions = list(filter(lambda x: x['type'].startswith('job.'), arr))
meeting_actions = list(filter(lambda x: x['type'].startswith('meeting.'), arr))
有没有什么实际的方法来实现它? 或者是一种蟒蛇的方式。
您可以使用(默认)dict按前缀收集元素:
from collections import defaultdict
result = defaultdict(list)
for o in arr:
result[o["type"][:o["type"].index(".")]].append(o)
这当然假定所有这些类型都有一个“。” 在他们身上。
例如,如果:
arr = [
{"type": "employee.update"},
{"type": "job.started"},
{"type": "meeting.xpto"},
{"type": "job.ended"}
]
则得到的result
为
{
"employee": [{"type": "employee.update"}],
"job": [{"type": "job.started"}, {"type": "job.ended"}],
"meeting": [{"type": "meeting.xpto"}]
}
您可以迭代arr
,使用collections.defaultdict
使用前缀作为键对每个类型进行分组。 我们可以使用str.split()
拆分.
上的类型,然后使用元组解包来解包前缀。
from collections import defaultdict
arr = [
{'type': 'employee.update'},
{'type': 'job.started'},
{'type': 'meeting.xpto'}
]
types = defaultdict(list)
for dic in arr:
prefix, _ = dic["type"].split(".")
types[prefix].append(dic)
print(types)
输出:
defaultdict(<class 'list'>, {'employee': [{'type': 'employee.update'}], 'job': [{'type': 'job.started'}], 'meeting': [{'type': 'meeting.xpto'}]})
如果我们只想追加类型而不是完整的字典:
types[prefix].append(dic["type"])
这将给出:
defaultdict(<class 'list'>, {'employee': ['employee.update'], 'job': ['job.started'], 'meeting': ['meeting.xpto']})