[英]Assigning python dictionary's nested value without mentioning the immediate key
我有几十行来更新嵌套字典中的值,如下所示:
dictionary["parent-key"]["child-key"] = [whatever]
这与每行的不同parent-key
一起使用,但它始终具有相同的child-key
。 此外, [whatever]
部分以独特的方式为每一行编写,因此简单递归不是这里的选项。 (尽管有人可能会建议制作一个单独的要分配的值列表,然后将它们分配给每个字典条目。)
有没有办法以更短的方式做同样的事情来避免重复的代码部分?
如果可以这样写,我会很高兴:
update_child_val("parent-key") = [whatever]
顺便说一句,我分配的[whatever]
部分将是一个冗长而复杂的代码,因此我不希望使用 function ,例如:
def update_child_val(parent_key, child_val):
dictionary[parent_key]["child-key"] = child_val
update_child_val("parent-key", [whatever])
具体用例:
我正在制作 ETL 以将数据库的表转换为 CSV,这是该过程的一部分。 我在下面写了一些示例。
single_item_template = {
# Unique values will be assigned in place of `None`later
"name": {
"id": "name",
"name": "Product Name",
"val": None
},
"price": {
"id": "price",
"name": "Product Price (pre-tax)",
"val": None
},
"tax": {
"id": "tax",
"name": "Sales Tax",
"val": 10
},
"another column id": {
"id": "another column id",
"name": "another 'name' for this column",
"val": "another 'val' for this column"
},
..
}
而且我有一个单独的区域来为源数据库表的每一行的字典single_item_template
的副本分配值。
for table_row in table:
item = Item(table_row)
此处的Item
class 将返回字典single_item_template
的副本,其中为item[column][val]
分配了更新的值。 并且每个val
都将涉及在给定 class 内更改设置器 function 中的值的唯一过程,例如
self._item["name"]["val"] = table_row["prod_name"].replace('_', ' ')
self._item["price"]["val"] = int(table_row["price_0"].replace(',', ''))
..
等等等等。
在上面的示例中, self._item
可以通过将其分配给变量来轻松缩短,但我想知道我是否也可以保存最后五个字符["val"]
。
(..或将最后一个逻辑部分作为字符串并稍后进行eval
,我真的不想这样做。)
(所以基本上我在这里要说的是我懒得打出["val"]
,但我也不费心去做。虽然我仍然对是否有这样的事情感兴趣,而我什至不确定事情通常存在于编程中..)
虽然您无法摆脱工作,但您可以通过几种不同的方式将其抽象出来。
假设您有一个父 ID 到预期值的映射:
values = {
'name': None,
'price': None,
'tax': 10,
'[another column id]': "[another 'val' for this column]"
}
一次设置所有这些只是两行代码:
for parent, val in values.items():
dictionary[parent]['val'] = val
不幸的是,没有一种简单或清晰的方法可以将其转换为 dict 理解。 您可以轻松地将其放入实用程序 function 中,将其转换为单行调用:
def set_children(d, parents, values, child='val'):
for parent, values in zip(parents, values):
d[parent][child] = value
set_children(dictionary, values.keys(), values.values())
在这种情况下,您的values
映射将对您要执行的转换进行编码:
values = {
'name': table_row["prod_name"].replace('_', ' '),
'price': int(table_row["price_0"].replace(',', '')),
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.