我有一系列的字典,比如:
[{'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'}, ...]发布于 2019-05-31 06:48:35
你只需要将你的结果扁平化即可。从本质上讲,当您需要平面映射操作时,您可以使用映射操作。
您可以通过使用嵌套列表理解来一次性完成此操作:
[x for ticket in raw for x in transform(ticket)]当然,您可以这样做:
[x for xs in map(transform, raw) for x in xs]或者只需要一个常规的嵌套循环就可以了。
发布于 2019-05-31 06:49:42
这是使用嵌套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'}]https://stackoverflow.com/questions/56386503
复制相似问题