[英]Python 3 - Scope of dict comprehension -> in object -> in list comprehension
我最近在 Python 3.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”
问题是是否有可能以某种方式将 scope 设置为列表理解?
我不是最先进的编码员,很高兴在这里提出任何有价值的意见
谢谢!
编辑
谢谢,实际上很简单,不知道为什么我想在这种情况下使用“更新”。 这是一个最小的工作示例:
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)]
非常感谢你们。 我将来会立即制作一个最小的工作样本!
您可以在列表理解中使用字典理解。 使用此答案,您可以构建以下内容:
operations = [ Object(args = {key:doc[key] for key in ("id", "name", "other key") } ) for doc in list_of_dicts ]
写了这个手机,所以还没有测试,但你可以用你想添加到args=
的更多键来填充那个元组
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.