【问题标题】:Cross-referencing between two lists in Python?Python中两个列表之间的交叉引用?
【发布时间】:2019-08-21 03:19:19
【问题描述】:

列表#1:

a=[
    {
        "id": 1,
        "name": "John Mark",
        "alias": "Batman",
    },
    {
        "id": 2,
        "name": "Luke Ben",
        "alias": "Spider",
    }
]

列表#2:

b=[
    {
        "uid": 1,
        "item": "eggs",
        "completed": False
    },
    {
        "uid": 1,
        "item": "milk",
        "completed": False
    },
    {
        "uid": 2,
        "item": "bread",
        "completed": False
    },
    {
        "uid": 2,
        "item": "cheese",
        "completed": True
    }
]

预期结果:

result=[
    {
        'name': 'John Mark',
        'alias': 'Batman',
        'shoppinglist': [
            'eggs',
            'milk'
        ]
    },
    {
        'name': 'Luke Ben',
        'alias': 'Spider',
        'shoppinglist': [
            'bread',
            'cheese'
        ]
    }
]

我有两个列表,我需要通过交叉引用这两个列表来创建一个新的字典列表。

我已开始尝试创建一个新列表以将 id/uid 存储在单独的列表中,但这没有用。

【问题讨论】:

  • 请贴出您尝试过的代码,以便我们帮助您找出问题所在。
  • 请出示您的新代码
  • “完成”会影响输出吗?如果没有,您只需将其删除。
  • userlist=[] for user in a: userlist.append(user['id']) In [1]: print (userlist) [1, 2]
  • li = {} #将slist的购物项目存入b: for i in userlist: li[i]=[] if b['uid']==i: print (i) print (b['item']) li[i].append(b['item']) 1 鸡蛋 1 牛奶 2 面包 2 奶酪

标签: python json list dictionary


【解决方案1】:

您可以使用setdefault来累积购物清单,例如:

代码

users = {x['id']: x for x in a}
for x in b:
    user = users[x['uid']]
    user.setdefault('shoppinglist', []).append(x['item'])
result = [users[i['id']] for i in a]

测试代码:

a = [
    {
        "id": 1,
        "name": "John Mark",
        "alias": "Batman",
    },
    {
        "id": 2,
        "name": "Luke Ben",
        "alias": "Spider",
    }
]

b = [
    {
        "uid": 1,
        "item": "eggs",
        "completed": False
    },
    {
        "uid": 1,
        "item": "milk",
        "completed": False
    },
    {
        "uid": 2,
        "item": "bread",
        "completed": False
    },
    {
        "uid": 2,
        "item": "cheese",
        "completed": True
    }
]

users = {x['id']: x for x in a}
for x in b:
    user = users[x['uid']]
    user.setdefault('shoppinglist', []).append(x['item'])
result = [users[i['id']] for i in a]

print(result)

结果:

[
    {'id': 1, 'name': 'John Mark', 'alias': 'Batman', 'shoppinglist': ['eggs', 'milk']}, 
    {'id': 2, 'name': 'Luke Ben', 'alias': 'Spider', 'shoppinglist': ['bread', 'cheese']}
]

【讨论】:

  • 非常感谢!如果我想排除 'id': 1 和 'alias': 'Batman',setdefault 是正确的工具吗?我也只想包含具有键值的项目:“已完成”:False
【解决方案2】:
for i in userlist:
    ...:         li[i]=[]
    ...:         if b['uid']==i:
    ...:             print (i)
    ...:             print (b['item'])
    ...:             li[i].append(b['item'])

每个购物项目都会重新初始化列表。 li[i] 应该只通过首先遍历用户列表来初始化一次。

userlist = []
li = []

for user in b:
    userlist.append(user.id)
    li[user.id] = []

【讨论】:

    【解决方案3】:
    for x in a:
        for y in b:
            if y['uid']== x['id']:
                x.setdefault('shoppinglist', []).append(y['item'])
    print(a) 
    

    如果您想在a 中自定义项目。

    print([{y: x[y] for y in list(x) if y!='id' and y!='alias'} for x in a])
    

    输出

    [{'name': 'John Mark', 'shoppinglist': ['eggs', 'milk']}, {'name': 'Luke Ben', 'shoppinglist': ['bread', 'cheese']}]
    

    【讨论】:

    • 谢谢!如果我想排除alias等其他元素,我还能使用setdefault吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 2015-09-30
    • 2012-04-23
    • 1970-01-01
    相关资源
    最近更新 更多