首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何合并基于dict的重复数组值列表?

如何合并基于dict的重复数组值列表?
EN

Stack Overflow用户
提问于 2022-07-17 22:31:48
回答 2查看 51关注 0票数 -2

我希望创建list3,获取it,然后与每个任务(list1)关联,并删除复制器,但我不会这么做。

代码语言:javascript
运行
复制
list1 = [
    {"Name": "Richard", "Tasks":["Deadlifts","Jump"]},
    {"Name": "Peter", "Tasks": ["Jump", "OverHead"]},
    {"Name": "Paul", "Tasks": ["Dumbbel","Jump"]} 
]

list2 = [
    {"Id":1, "Exercise":["Deadlifts","Jump"]},
    {"Id":2, "Exercise":["Deadlifts"]},
    {"Id":3, "Exercise":["Dumbbel"]},
    {"Id":4, "Exercise":["OverHead","Jump"]},
    {"Id":5, "Exercise":["Deadlifts","Jump"]},
    {"Id":6, "Exercise":["Jump","Dumbbel","OverHead"]},
]

grabId = {}
for i in list2:
    for k in i["Exercise"]:
        grabId.setdefault(k,[]).append(i["Id"])

# {'Deadlifts': [1, 2, 5], 'Jump': [1, 4, 5, 6], 'Dumbbel': [3, 6], 'OverHead': [4, 6]}

我所期待的..。

代码语言:javascript
运行
复制
list3 = [
    {"Name": "Richard", "Tasks":["Deadlifts","Jump"], "Ids":[1,2,4,5,6]},
    {"Name": "Peter", "Tasks": ["Jump", "OverHead"], "Ids":[1,3,4,5,6]},
    {"Name": "Paul", "Task": ["Dumbbel","Jump"], "Ids":[1,3,4,5,6]} 
]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-17 22:53:22

我希望我能很好地理解你的问题:

代码语言:javascript
运行
复制
list1 = [
    {"Name": "Richard", "Tasks": ["Deadlifts", "Jump"]},
    {"Name": "Peter", "Tasks": ["Jump", "OverHead"]},
    {"Name": "Paul", "Tasks": ["Dumbbel", "Jump"]},
]

list2 = [
    {"Id": 1, "Exercise": ["Deadlifts", "Jump"]},
    {"Id": 2, "Exercise": ["Deadlifts"]},
    {"Id": 3, "Exercise": ["Dumbbel"]},
    {"Id": 4, "Exercise": ["OverHead", "Jump"]},
    {"Id": 5, "Exercise": ["Deadlifts", "Jump"]},
    {"Id": 6, "Exercise": ["Jump", "Dumbbel", "OverHead"]},
]

tmp = {}
for d in list2:
    for e in d["Exercise"]:
        tmp.setdefault(e, []).append(d["Id"])

list3 = [
    {**d, "Ids": sorted(set(i for t in d["Tasks"] for i in tmp[t]))}
    for d in list1
]
print(list3)

指纹:

代码语言:javascript
运行
复制
[
    {"Name": "Richard", "Tasks": ["Deadlifts", "Jump"], "Ids": [1, 2, 4, 5, 6]},
    {"Name": "Peter", "Tasks": ["Jump", "OverHead"], "Ids": [1, 4, 5, 6]},
    {"Name": "Paul", "Tasks": ["Dumbbel", "Jump"], "Ids": [1, 3, 4, 5, 6]},
]
票数 2
EN

Stack Overflow用户

发布于 2022-07-17 23:08:28

有时,将任务分解成可管理的部分并首先测试它们是个好主意:

代码语言:javascript
运行
复制
def get_ids(exercises):
    exercises = set(exercises)
    return list(set(d["Id"] for d in list2 if 
                    exercises.intersection(d["Exercise"])))

assert(get_ids(["Jump"]) == [1, 4, 5, 6])
assert(get_ids(["Deadlifts", "Jump"]) == [1, 2, 4, 5, 6])

现在把它们放在一起:

代码语言:javascript
运行
复制
for person in list1:
    person["Ids"] = get_ids(person["Tasks"])
print(list1)
代码语言:javascript
运行
复制
[{'Name': 'Richard', 'Tasks': ['Deadlifts', 'Jump'], 'Ids': [1, 2, 4, 5, 6]}, {'Name': 'Peter', 'Tasks': ['Jump', 'OverHead'], 'Ids': [1, 4, 5, 6]}, {'Name': 'Paul', 'Tasks': ['Dumbbel', 'Jump'], 'Ids': [1, 3, 4, 5, 6]}]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73015794

复制
相关文章

相似问题

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