Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,如何在不循环的情况下获取键的值_Python_Dictionary_For Loop - Fatal编程技术网

在Python中,如何在不循环的情况下获取键的值

在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

我有一个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', 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
。不幸的是,可能会有。