将一个数组映射到另一个数组

时间:2019-05-30 22:39:53

标签: python python-3.x

我有一系列的字典,如:

[{'id': 1, 'tags': ['tag_a', 'tag_b']}, {'id': 2, 'tags': ['tag_c', 'tag_b']}]

,我想基于ticket_id将此数组转换为新数组,并且每个tag值都应该是该数组中的一个对象。

我几乎使用以下功能来做到这一点:

raw = [{'id': 1, 'tags': ['tag_a', 'tag_b']}, {'id': 2, 'tags': ['tag_c', 'tag_b']}]

def transform(ticket):
    result = []
    for tag in ticket.get('tags', []):
        result.append({'ticket_id': ticket.get('id'), 'tag': tag, 'sync': '123'})
    return result

print(list(map(transform, raw)))

但是它返回了类似[[{...}], [{...}]]的内容,语法看起来很奇怪。

返回类似内容的正确方法是什么?

[{'ticket_id': 1, 'tag': 'tag_a', 'sync': '123'}, {'ticket_id': 1, 'tag': 'tag_b', 'sync': '123'}, ...]

2 个答案:

答案 0 :(得分:4)

您只需要弄平结果。本质上,您在需要平面地图操作时使用了地图操作。

您可以使用嵌套列表理解功能一次完成此操作:

C4

当然,您可以做类似的事情:

HEAD

或者只是一个常规的嵌套循环都可以工作。

答案 1 :(得分:2)

这是使用嵌套的for循环执行此操作的一种方法。而且,您不需要map您的函数。您可以将列表传递给函数并进行打印。代码的问题在于,您使用了一个for循环,而tags的深度(长度)大于一个

raw = [{'id': 1, 'tags': ['tag_a', 'tag_b']}, {'id': 2, 'tags': ['tag_c', 'tag_b']}]

def transform(ticket):
    result = []
    for dic in raw:
        for tag in dic['tags']:
            result.append({'ticket_id': dic['id'], 'tag': tag, 'sync': '123'})
    return result

print(transform(raw))
# [{'ticket_id': 1, 'tag': 'tag_a', 'sync': '123'}, {'ticket_id': 1, 'tag': 'tag_b', 'sync': '123'}, 
#  {'ticket_id': 2, 'tag': 'tag_c', 'sync': '123'}, {'ticket_id': 2, 'tag': 'tag_b', 'sync': '123'}]