Python 使用字典理解从字典列表中选定的字典创建新的字典
目录的来源列表:Python 使用字典理解从字典列表中选定的字典创建新的字典,python,dictionary,list-comprehension,Python,Dictionary,List Comprehension,目录的来源列表: 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': "9323
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
一样,它只是创建了一个单一的理解,但在一个列表中。这不仅仅是你想要的吗
sel_employee = [employee for employee in employees if employee['id'] == 2][0]
这不正是你想要的吗
sel_employee = [employee for employee in employees if employee['id'] == 2][0]
这是另一种方法。 如果未找到
id==2
为True
的词典,它还将sel\u employee
设置为None
sel_employee = next((employee for employee in employees if employee['id'] == 2), None)
这是另一种方法。 如果未找到
id==2
为True
的词典,它还将sel\u employee
设置为None
sel_employee = next((employee for employee in employees if employee['id'] == 2), None)
或:
输出:
{'id': 2, 'name': 'Mary', 'last_name': 'Sue', 'email': 'jjeelasj221@zbigg.net',
'phone': '932342384758', 'role': 'Manager'}
或:
输出:
{'id': 2, 'name': 'Mary', 'last_name': 'Sue', 'email': 'jjeelasj221@zbigg.net',
'phone': '932342384758', 'role': 'Manager'}
您可以使用一个简单的
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
和生成器表达式,如下所示。但是,生成器表达式有开销,这对于较大的列表来说可能非常昂贵。您可以使用一个简单的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
和生成器表达式,如下所示。但是,生成器表达式有开销,这对于较大的列表来说可能非常昂贵。因此,本质上,您只想在列表中找到与条件匹配的第一个元素。id
字段是否唯一?换句话说:您的输出是否总是包含一个项目?为什么要使用理解来完成此操作?我这样问是因为似乎没有必要做你想做的事情。是的,id字段将是唯一的。所以本质上你只想在列表中找到第一个匹配条件的元素?id字段是否唯一?换句话说:您的输出是否总是包含一个项目?为什么要使用理解来完成此操作?我这样问是因为似乎没有必要做你想做的事情。是的,id字段将是唯一的。这不仅仅是另一种方法。这是最有效的方法,因为一旦找到满足条件的结果,我们就停止循环。这不会发生在列表理解中。哦,生成器!这不仅仅是另一种方式。这是最有效的方法,因为一旦找到满足条件的结果,我们就停止循环。这不会发生在列表理解中。哦,生成器!这实际上没有多大意义,即使它确实提供了期望的结果。为什么要创建一个新的dict?为什么不直接打印(l[0])呢?@Ev.Kounis我的答案不仅给出了l[0]
而且给出了所有的元素,如果有>1,这实际上没有多大意义,即使它确实提供了期望的结果。为什么要创建一个新的dict?为什么不直接打印(l[0])呢?@Ev.Kounis我的答案不仅给出了l[0]
如果有>1,它会给出所有的元素,而不是初始化+更新,只要在中声明它,如果@Ev.Kounis,你就可以这样做。但是,在这种情况下,emp_done
可能作为变量存在,也可能不作为变量存在。我不是一个pythonicness方面的专家,但是如果emp_完成了,我宁愿有一个空的dict和test,如果必要的话。@jpp说得好。但是,您可以初始化并重新声明\覆盖,前提是重新声明可能比更新
方法更快。或者,您可以在if
@Ev.Kounis中简单地声明它,而不是初始化+更新。但是,在这种情况下,emp_done
可能作为变量存在,也可能不作为变量存在。我不是一个pythonicness方面的专家,但是如果emp_完成了,我宁愿有一个空的dict和test,如果必要的话。@jpp说得好。但是,您可以初始化并重新声明\覆盖,前提是重新声明可能比update
方法更快。