【问题标题】:Using dictionary comprehension to create a new dict from selected dict in list-of-dicts使用字典理解从字典列表中的选定字典创建新字典
【发布时间】:2019-01-16 19:09:20
【问题描述】:

字典的来源列表:

employees = [{'id':1, 'name': "Jonathan", 'last_name':"Wilkinson", "email":"jwilki@zbigg.com", 'phone':"98753215646", 'role':"Owner"},
            {'id':2, 'name': 'Mary', 'last_name': 'Sue', 'email': 'jjeelasj221@zbigg.net',  'phone': "932342384758", 'role': 'Manager'},
            {'id':3,'name': "Joanna", 'last_name': "Kenderson", 'email':'kjjsdakjae@kkzbigg.com', 'phone': '9876478398478', 'role': 'Employee'}
            ]

我想创建一个选择单个 dict 并将其添加到包含单个 dict 的新变量的理解:

sel_employee = [employee for employee in employees if employee['id'] == 2]

emp_done = {}
for employee in sel_employee:
    emp_done = employee

换句话说,如何将上述理解之后的所有内容添加到所说的理解中?

由于目前没有emp_done,它只是创建了一个单一的理解,但在一个列表中。

【问题讨论】:

  • 所以本质上你只想找到列表中第一个匹配条件的元素?
  • id 字段是否唯一?换句话说:您的输出是否总是包含一项?
  • 为什么您要使用理解来执行此操作?我问是因为似乎没有必要做你想做的事。
  • 是的,id 字段将是唯一的。

标签: python dictionary list-comprehension


【解决方案1】:

这不正是你想要的吗?

sel_employee = [employee for employee in employees if employee['id'] == 2][0]

【讨论】:

    【解决方案2】:

    这是另一种方法。 如果没有找到 id == 2True 的字典,它也会将 sel_employee 设置为 None

    sel_employee = next((employee for employee in employees if employee['id'] == 2), None)
    

    【讨论】:

    • 这不仅仅是另一种方法。这是最有效的方法,因为一旦找到满足条件的结果,我们就会停止循环。列表理解不会发生这种情况。
    • 哦,发电机!
    【解决方案3】:

    或者:

    l = [employee for employee in employees if employee['id'] == 2]
    print({1:l[0]}.get(len(l),l))
    

    输出:

    {'id': 2, 'name': 'Mary', 'last_name': 'Sue', 'email': 'jjeelasj221@zbigg.net',
    'phone': '932342384758', 'role': 'Manager'}
    

    【讨论】:

    • 这实际上并没有多大意义,即使它确实提供了预期的结果。你为什么要创建一个新的字典?为什么不直接print(l[0])
    • @Ev.Kounis 我的回答不仅给出了l[0],它还给出了所有的元素,如果有 > 1
    【解决方案4】:

    您可以使用简单的for 循环并在满足您的条件时使用dict.update 后跟break

    emp_done = {}
    for employee in sel_employee:
        if employee['id'] == 2:
            emp_done.update(employee)
            break
    

    如果您的条件从未满足,emp_done 将保持为空字典。如果满足您的条件,emp_done 将只给出第一个实例。

    同样,您可以将next@Ozzy's solution 中的生成器表达式一起使用。但是,生成器表达式有开销,这对于较大的列表可能会很昂贵。

    【讨论】:

    • 或者不是初始化+更新,而是简单地在if中声明它。
    • @Ev.Kounis,你可以这样做。但是,您遇到emp_done 可能作为变量存在也可能不作为变量存在的情况。我不是 Pythonic 方面的专家,但我宁愿有一个空的 dict 并在必要时测试 if emp_done
    • @jpp 好点。但是,您可以在重新声明可能比 update 方法更快的前提下初始化并重新声明\覆盖。
    猜你喜欢
    • 1970-01-01
    • 2016-06-09
    • 2018-06-21
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多