在Python中,如何在不循环的情况下获取键的值
我有一个for循环,在这个循环中,我需要分配从另一个字典中获取的新键的值。我试图避免for循环中的for循环。我的第一本词典如下所示:在Python中,如何在不循环的情况下获取键的值,python,dictionary,for-loop,Python,Dictionary,For Loop,我有一个for循环,在这个循环中,我需要分配从另一个字典中获取的新键的值。我试图避免for循环中的for循环。我的第一本词典如下所示: ids = [{'1020': 'ID-2522'}, {'1030': 'ID-2523'}, {'1040': 'ID-2524'}] data = [{'sf_id': '1020', TotalPrice': '504'}, {'sf_id': '1030', TotalPrice': '400'}, {'sf_id': '1040', TotalPr
ids = [{'1020': 'ID-2522'}, {'1030': 'ID-2523'}, {'1040': 'ID-2524'}]
data = [{'sf_id': '1020', TotalPrice': '504'}, {'sf_id': '1030', TotalPrice': '400'}, {'sf_id': '1040', TotalPrice': '500'}]
我正在循环浏览的词典列表如下所示:
ids = [{'1020': 'ID-2522'}, {'1030': 'ID-2523'}, {'1040': 'ID-2524'}]
data = [{'sf_id': '1020', TotalPrice': '504'}, {'sf_id': '1030', TotalPrice': '400'}, {'sf_id': '1040', TotalPrice': '500'}]
以下是我的for循环:
for index, my_dict in enumerate(data):
for key, value in my_dict.items():
new_id = my_dict["sf_id"]
opportunity = ids[new_id]
因此它获取相应的值。预期的产出将是:
print(opportunity)
ID-2522
ID-2523
ID-2524
假设整个集合中没有重复的密钥,您可以使用它将每个id dict合并为单个id dict,这样您只需迭代两个集合一次
from functools import reduce
ids = [{'1020': 'ID-2522'}, {'1030': 'ID-2523'}, {'1040': 'ID-2524'}]
data = [{'sf_id': '1020', 'TotalPrice': '504'}, {'sf_id': '1030', 'TotalPrice': '400'}, {'sf_id': '1040', 'TotalPrice': '500'}]
ids_map = reduce(lambda x, y: x.update(y) or x , ids, {})
for my_dict in data:
new_id = my_dict["sf_id"]
opportunity = ids_map[new_id]
print(opportunity)
正如@mad_的评论所指出的,
ids
是一个dict列表,而不是dict。这使得查找其中一个键的效率非常低,因为您必须遍历整个列表才能找到它
因此,第一步是将所有这些小的dict合并成一个大的dict
然后,我们可以有效地建立一个包含您预期输出的列表:
ids = [{'1020': 'ID-2522'}, {'1030': 'ID-2523'}, {'1040': 'ID-2524'}]
data = [{'sf_id': '1020', 'TotalPrice': '504'},
{'sf_id': '1030', 'TotalPrice': '400'},
{'sf_id': '1040', 'TotalPrice': '500'}]
ids_dict = {k:v for dct in ids for k, v in dct.items()}
opportunity = []
for my_dict in data:
new_id = my_dict["sf_id"]
opportunity.append(ids_dict[new_id])
print(opportunity)
# ['ID-2522', 'ID-2523', 'ID-2524']
(请注意,如果不使用索引,则不需要枚举
)
或者,更简短地说,使用列表:
opportunity = [ids_dict[my_dict["sf_id"]] for my_dict in data]
print(opportunity)
# ['ID-2522', 'ID-2523', 'ID-2524']
您的ID是一个列表,而不是字典列表。不会改变事实。如果我更改id中的键,那么它仍然返回相同的数据,这是错误的,我需要它只返回与特定键关联的值,所以假设sf_id键没有1020值,那么它不应该返回id-2522。。。如果我将sf_id从1020更改为1234,它将返回id-2522。否则,它将给出一个keyrerror。如果
id
中可能缺少某个id,您应该在问题中说明这一点。替换所有键,它将返回相同的结果。不是一个关键错误您没有复制整个代码,您忘记了ids_dict={k:v for dct in ids for k,v in dct.items()}
,并使用了使用第一个数据创建的版本,因此您得到了旧结果。如果操作正确,您将得到KeyError:1020
。不幸的是,可能会有。