提问者:小点点

如何根据属性值将数组拆分成另一组?


我有一个数组,它包含几种类型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))

有没有什么实际的方法来实现它? 或者是一种蟒蛇的方式。


共2个答案

匿名用户

您可以使用(默认)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']})