首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将一个数组映射到另一个数组

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

Stack Overflow用户
提问于 2019-05-31 06:39:53
回答 2查看 3.2K关注 0票数 1

我有一系列的字典,比如:

代码语言:javascript
运行
复制
[{'id': 1, 'tags': ['tag_a', 'tag_b']}, {'id': 2, 'tags': ['tag_c', 'tag_b']}]

我想把这个数组转换成一个基于ticket_id的新数组,每个tag值都应该是数组中的一个对象。

我几乎使用了下面的函数:

代码语言:javascript
运行
复制
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)))

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

返回类似以下内容的正确方法是什么:

代码语言:javascript
运行
复制
[{'ticket_id': 1, 'tag': 'tag_a', 'sync': '123'}, {'ticket_id': 1, 'tag': 'tag_b', 'sync': '123'}, ...]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-31 06:48:35

你只需要将你的结果扁平化即可。从本质上讲,当您需要平面映射操作时,您可以使用映射操作。

您可以通过使用嵌套列表理解来一次性完成此操作:

代码语言:javascript
运行
复制
[x for ticket in raw for x in transform(ticket)]

当然,您可以这样做:

代码语言:javascript
运行
复制
[x for xs in map(transform, raw) for x in xs]

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

票数 3
EN

Stack Overflow用户

发布于 2019-05-31 06:49:42

这是使用嵌套for循环的一种方法。此外,你不需要map你的函数。您可以将列表传递给函数并打印出来。代码的问题在于,您使用了单个for循环,而tags的深度(长度)不止一个

代码语言:javascript
运行
复制
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'}]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56386503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档