我有一系列的字典,如:
[{'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'}, ...]
答案 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'}]