【问题标题】:How do I look get an associated value in a json variable using python?如何使用 python 在 json 变量中获取关联值?
【发布时间】:2023-03-30 08:46:01
【问题描述】:

当 2 在字典中时,我如何查找与一个人的“姓名”相关联的“id”?

user = 'PersonA'
id = ? #How do I retrieve the 'id' from the user_stream json variable?

json,存储在名为“user_stream”的变量中

[
  {
    'name': 'PersonA',
    'id': '135963'
  },
  {
    'name': 'PersonB',
    'id': '152265'
  },
]

【问题讨论】:

    标签: python json dictionary


    【解决方案1】:

    您必须解码 JSON 结构并遍历所有字典,直到找到匹配项:

    for person in json.loads(user_stream):
        if person['name'] == user:
            id = person['id']
            break
    else:
        # The else branch is only ever reached if no match was found
        raise ValueError('No such person')
    

    如果您需要进行多次查找,您可能希望将此结构转换为 dict 以简化查找:

    name_to_id = {p['name']: p['id'] for p in json.loads(user_stream)}
    

    然后直接查找id

    id = name_to_id.get(name)  # if name is not found, id will be None
    

    上面的例子假设名字是唯一的,如果不是,使用:

    from collections import defaultdict
    
    name_to_id = defaultdict(list)
    for person in json.loads(user_stream):
        name_to_id[person['name']).append(person['id'])
    
    # lookup
    ids = name_to_id.get(name, [])  # list of ids, defaults to empty
    

    这始终是一种权衡,您可以用内存换取速度。

    【讨论】:

    • 没有循环就没有办法吗?我无法“搜索”PersonA?
    • @sharataka:不是以适用于所有 JSON 格式变化的方式,不。
    • 谢谢,但是所有 JSON 格式变化是什么意思?
    • 不应该将else 块缩进与if 块相同的级别吗?
    • @DavidPärsson:不,它与for 循环有关。如果我们没有跳出循环,它就会被执行。
    【解决方案2】:

    Martijn Pieters 的解决方案是正确的,但如果您打算进行多次此类查找,最好加载 json 并仅对其进行一次迭代,而不是每次查找。

    name_id = {}
    
    for person in json.loads(user_stream):
        name = person['name']
        id = person['id']
        name_id[name] = id
    
    user = 'PersonA'
    print name_id[user]
    

    【讨论】:

    • +1。如果您的数据的结构不适合您的预期用途,那么一个好的做法是先重组数据,然后再使用它。
    【解决方案3】:
    persons = json.loads(...)
    results = filter(lambda p:p['name'] == 'avi',persons)
    if results:
        id = results[0]["id"]
    

    results当然可以多于1..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 2020-09-02
      • 2021-08-05
      • 2019-04-15
      • 2016-05-01
      • 1970-01-01
      相关资源
      最近更新 更多