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

Python 将一个数组映射到另一个数组,python,python-3.x,Python,Python 3.x,我有一系列的dict,比如: [{'id': 1, 'tags': ['tag_a', 'tag_b']}, {'id': 2, 'tags': ['tag_c', 'tag_b']}] 我想根据ticket_id将这个数组转换成一个新数组,每个标记值都应该是数组中的一个对象 我几乎是使用以下功能完成的: raw = [{'id': 1, 'tags': ['tag_a', 'tag_b']}, {'id': 2, 'tags': ['tag_c', 'tag_b']}] def trans

我有一系列的dict,比如:

[{'id': 1, 'tags': ['tag_a', 'tag_b']}, {'id': 2, 'tags': ['tag_c', 'tag_b']}]
我想根据ticket_id将这个数组转换成一个新数组,每个标记值都应该是数组中的一个对象

我几乎是使用以下功能完成的:

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'}, ...]
[x for xs in map(transform, raw) for x in xs]

你只需要把结果展平。本质上,当需要平面贴图操作时,使用了贴图操作

您可以使用嵌套列表一次性完成此操作:

[x for ticket in raw for x in transform(ticket)]
当然,你可以做一些类似的事情:

[{'ticket_id': 1, 'tag': 'tag_a', 'sync': '123'}, {'ticket_id': 1, 'tag': 'tag_b', 'sync': '123'}, ...]
[x for xs in map(transform, raw) for x in xs]

或者只需要一个常规的嵌套循环就可以了。

您只需要将结果展平。本质上,当需要平面贴图操作时,使用了贴图操作

您可以使用嵌套列表一次性完成此操作:

[x for ticket in raw for x in transform(ticket)]
当然,你可以做一些类似的事情:

[{'ticket_id': 1, 'tag': 'tag_a', 'sync': '123'}, {'ticket_id': 1, 'tag': 'tag_b', 'sync': '123'}, ...]
[x for xs in map(transform, raw) for x in xs]

或者只使用常规嵌套循环就可以了。

这是使用嵌套for循环的一种方法。此外,您不需要映射函数。您只需将列表传递给函数并打印即可。代码的问题是使用了一个for循环,而标记的深度长度不止一个

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'}]

这是使用嵌套for循环实现的一种方法。此外,您不需要映射函数。您只需将列表传递给函数并打印即可。代码的问题是使用了一个for循环,而标记的深度长度不止一个

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'}]