繁体   English   中英

分配 python 字典的嵌套值而不提及立即键

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM