Python 将一个数组映射到另一个数组
我有一系列的dict,比如: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
[{'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'}]