Python 3-dict理解的范围->;在对象中->;在列表理解中

Python 3-dict理解的范围->;在对象中->;在列表理解中,python,python-3.x,Python,Python 3.x,我最近在Python3.x中遇到了这个问题,由于我找不到解决方案,我正在寻找一些关于如何正确解决这个问题的澄清 list_of_dicts = [dict_a, dict_b] dict_a = {"id": 123, "foo": "bar"} ... 根据目录列表,我想创建另一个列表 此列表应包含某种类型的对象,然后我将使用这些对象执行某些操作,在我对数据库进行批量写入的情况下,这将按预期工作: operations = [ Ob

我最近在Python3.x中遇到了这个问题,由于我找不到解决方案,我正在寻找一些关于如何正确解决这个问题的澄清

list_of_dicts = [dict_a, dict_b]
dict_a = {"id": 123, "foo": "bar"}
...
根据目录列表,我想创建另一个列表

此列表应包含某种类型的对象,然后我将使用这些对象执行某些操作,在我对数据库进行批量写入的情况下,这将按预期工作:

operations = [ Object(arg = {"id": doc["id"]}) for doc in list_of_dicts ]
write_to_db(operations)
我的问题如下:在某些情况下,我想向arg字典添加更多的键值对:

further_keys = ["foo"]
operations = [ Object(arg = {"id": doc["id"]}.update({i:doc[i] for i in further_keys}))
               for doc in list_of_dicts ]
不幸的是,这失败了,因为在dict comp的上下文中没有分配“doc”

问题是,是否有可能以某种方式将范围设置为列表

我不是最先进的编码员,所以很高兴这里有任何有价值的输入

谢谢

编辑

谢谢,其实很简单,不知道我为什么要在这个例子中使用“更新”。这里是一个最小的工作示例:

import pymongo

data = [{"id":1, "map": "DE", "date":"today"}, 
        {"id":2, "map": "FR", "date":"tomorrow"},
        {"id":3, "map": "IT", "date":"yesterday"}]

additional_keys = ["map"]
standard_key = ["id"]
key_tuple = tuple(standard_key + additional_keys)

operations = [ pymongo.operations.ReplaceOne(
               filter={key:doc[key] for key in key_tuple}, 
               replacement=doc, 
               upsert=True) 
               for doc in data ]
根据需要,产生:

[ReplaceOne({'id': 1, 'map': 'DE'}, {'id': 1, 'map': 'DE', 'date': 
 'today'}, True, None),
 ReplaceOne({'id': 2, 'map': 'FR'}, {'id': 2, 'map': 'FR', 'date': 
 'tomorrow'}, True, None),
 ReplaceOne({'id': 3, 'map': 'IT'}, {'id': 3, 'map': 'IT', 'date': 
 'yesterday'}, True, None)]
非常感谢你们。
我将在未来生产一个最低限度的工作样品马上

您可以在列表理解中使用字典理解。使用answer,您可以构造以下内容:

operations=[Object(args={key:doc[key]用于输入(“id”、“name”、“other key”)})用于输入目录列表中的文档]

写了这个手机,所以还没有测试,但是你可以用你想添加到
args=

的更多键填充这个元组。你可以在列表理解中使用字典理解。使用answer,您可以构造以下内容:

operations=[Object(args={key:doc[key]用于输入(“id”、“name”、“other key”)})用于输入目录列表中的文档]

写了这个手机,所以还没有测试,但是你可以用你想添加到
args=

的更多键填充这个元组,我建议不要在这个用例中使用理解,因为它可能会使你的代码无法理解。请提一提,你*不应该使用理解结构来产生副作用
doc[“id”].update(…)
返回
None
,因此
Object
将始终与
Object(arg=None)
一起调用,但这与您看到的错误并不相关。无论如何,您的错误是不可再现的:返回预期的,而不是错误。请提供一个我建议不要对这个用例使用理解,因为它可能会使您的代码无法理解。请提供一个。顺便说一句,您*不应该使用理解结构来产生副作用
doc[“id”].update(…)
返回
None
,因此
Object
将始终与
Object(arg=None)
一起调用,但这与您看到的错误并不相关。无论如何,您的错误是不可再现的:返回预期的,而不是错误。请提供一个例子,这不是必需的,OPs代码应该可以正常工作(虽然它没有做OP认为它正在做的事情),OP的代码不工作,但正如您所说,它不是因为他们描述的错误。即使他们错误地解释了失败的原因,我认为我们仍然可以清楚地看到它失败的原因,并提供一个可行的替代方案。这是没有必要的,OPs代码应该可以正常工作(尽管它没有做OP认为它正在做的事情)OP的代码不工作,但正如你所说,这不是因为他们所描述的错误。即使他们错误地解释了失败的原因,我认为我们仍然可以清楚地看到它失败的原因,并提供一个可行的替代方案。