【问题标题】:Dictionary with values dependent on / linked to values of another dictionary in Python字典的值依赖于/链接到 Python 中另一个字典的值
【发布时间】:2020-01-02 20:58:34
【问题描述】:

我需要创建一个字典,其值依赖于/链接到 Python 中另一个字典的值。

最小工作示例:

from pprint import pprint
import os

miscellaneous = {'input_dir': "Results/Job_test/Input/",
                 'output_dir': "Results/Job_test/Output/",
                 'file_name_basis': "truss",
                 'file_name_extension_input': ".input",
                 'file_name_extension_output': ".output",
                 'screen_width_to_height_ratio': 16 / 9}

postprocessing = {'archive': {'execute': False,
                              'type': 'xztar',
                              'file_name_basis': miscellaneous['file_name_basis'],
                              'file_name_extension': ".tar.xz",
                              'output_dir': miscellaneous['output_dir'],
                              'directory_to_archive': "."}}

# Input_definition, final assembly.
input_def = {'miscellaneous': miscellaneous,
             'postprocessing': postprocessing}

pprint(input_def)
miscellaneous.update({'output_dir': "I_made_it/"})
print("================================================================================")
pprint(input_def)  # Only input_def['miscellaneous']['output_dir'] changed, but not input_def['postprocessing']['archive']['output_dir'].

我应该改变什么,不仅input_def['miscellaneous']['output_dir']更改为I_made_it/,而且input_def['postprocessing']['archive']['output_dir']更改为I_made_it/

【问题讨论】:

  • 嗨,Adriaan,我的回答对您有帮助吗,还是您还有问题?如果是这样,请接受它,这样问题就会关闭。

标签: python dictionary dependencies


【解决方案1】:

我不认为我的回答比其他任何人都好,但这可能是你所期望的。

您可以将“output_dir”映射到稍后将评估的字典。虽然,这可能会导致您的字典结构发生变化。您映射到整个字典并再次映射到一个字段看起来很连贯。

postprocessing = {'archive': {'execute': False,
                              'type': 'xztar',
                              'file_name_basis': miscellaneous['file_name_basis'],
                              'file_name_extension': ".tar.xz",
                              'output_dir': miscellaneous,
                              'directory_to_archive': "."}}

长期而言,你应该尝试对象。

【讨论】:

    【解决方案2】:

    你必须在 python 中使用对象。如果我没有错过任何东西,应该这样做。

    from pprint import pprint
    import os
    
    class the_directories:
        __init__(self):
            self.out = "Results/Job_test/Output/"
            self.in_d = "Results/Job_test/Input/"
    
    dir = the_directories()
    
    miscellaneous = {'input_dir': dir.in_d,
                     'output_dir' dir.out: ,
                     'file_name_basis': "truss",
                     'file_name_extension_input': ".input",
                     'file_name_extension_output': ".output",
                     'screen_width_to_height_ratio': 16 / 9}
    
    postprocessing = {'archive': {'execute': False,
                                  'type': 'xztar',
                                  'file_name_basis': miscellaneous['file_name_basis'],
                                  'file_name_extension': ".tar.xz",
                                  'output_dir': dir.out,
                                  'directory_to_archive': "."}}
    
    # Input_definition, final assembly.
    input_def = {'miscellaneous': miscellaneous,
                 'postprocessing': postprocessing}
    
    pprint(input_def)
    dir.out = "I_made_it/"
    print("================================================================================")
    pprint(input_def)  # Only input_def['miscellaneous']['output_dir'] changed, but not input_def['postprocessing']['archive']['output_dir'].
    

    【讨论】:

      【解决方案3】:

      postprocessing 的减速和定义中的表达式 'output_dir': miscellaneous['output_dir'], 在赋值时进行评估 - 不保留状态。

      为了有状态,你可以使用对象。一个小的工作示例可能是:

      class MyOutputDir(object):
          outputDir = ""
      
      outputDirInstance = MyOutputDir()
      outputDirInstance.outputDir = "This is one value"
      
      d1 = {"o1": outputDirInstance}
      
      d2 = {"o1": d1["o1"]}
      
      print(d2["o1"].outputDir)
      # prints: 'This is one value'
      
      d2["o1"].outputDir = "Another, newer value"
      
      print(d1["o1"].outputDir)
      # prints: 'Another, newer value'
      

      要阅读有关 python 中的类和对象的更多信息,请参阅https://docs.python.org/3.7/tutorial/classes.html:那里可能有更多您可能会觉得有用的信息,因为您似乎正在“拉伸”应使用 dicts (即 DATA ) 并且您可能应该考虑一种更面向对象的方法。

      祝你好运:)

      【讨论】:

        猜你喜欢
        • 2014-04-23
        • 1970-01-01
        • 2018-08-23
        • 2014-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-08
        相关资源
        最近更新 更多