在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ python的字典中,如何向指定路徑添加值?

python的字典中,如何向指定路徑添加值?

想實現(xiàn)一個函數(shù),傳入字典,路徑/鍵的列表,返回修改后的字典。
大概是這個意思

def add_value(dict, path, value):
    # dict是待修改的字典
    # path是路徑,列表形式,如`['A', 'B', 'C']`, A目錄下有B目錄,B目錄下有C目錄
    # value是一個元組、列表、字典或者字符串
    ……
    return dict

需要實現(xiàn)的功能大概像這樣:

d = {}
add_value(d, ['A', 'B', 'C'], ('output.txt', '2mb'))
{'A': {'B': {'C': [('output.txt', '2mb')]}}}
add_value(d, ['X', 'Y'], ('log.txt', '10kb'))
{'A': {'B': {'C': 'string'}}, 'X': {'Y': [('log.txt', '10kb'),]}}
add_value(d, ['A', 'B', 'C'], ('video.mp4', '2GB'))
{'A': {'B': {'C': [('output.txt', '2mb'), ('video.mp4', '2GB')]}}, 'X': {'Y': {'Z': [('log.txt', '10kb'),]}}}

path的長度是不定的,或者說目錄的深度是不定的,所以好像要用循環(huán)調(diào)用,不能用幾個if結(jié)構(gòu)。
python新手,實在不知如何實現(xiàn),求教。

回答
編輯回答
背叛者

如果不是做特定的oj題目的話, 推薦使用xml, 更直觀, 也更好管理

from lxml import etree


def gen_xpath(path):
    return '//root/' + '/'.join(path)


def add_value(root, path, value):
    purpose_path = gen_xpath(path)
    folder = root.xpath(purpose_path)
    parent_folder = root
    if not folder:
        for i, name in enumerate(path, 1):
            temp_path = gen_xpath(path[:i])
            temp_folder = root.xpath(temp_path)
            if not temp_folder:
                parent_folder = etree.SubElement(parent_folder, name)
            else:
                parent_folder = temp_folder
    
    folder = root.xpath(purpose_path)[0]
    file = etree.SubElement(folder, 'file')
    file.set('name', value[0])
    file.set('size', value[1])


if __name__ == '__main__':
    root = etree.Element('root')
    add_value(root, ['A', 'B', 'C'], ('output.txt', '2mb'))
    add_value(root, ['X', 'Y'], ('log.txt', '10kb'))
    add_value(root, ['A', 'B', 'C'], ('video.mp4', '2GB'))
    etree.ElementTree(root).write('test.xml', pretty_print=True)

輸出結(jié)果:

<root>
  <A>
    <B>
      <C>
        <file name="output.txt" size="2mb"/>
        <file name="video.mp4" size="2GB"/>
      </C>
    </B>
  </A>
  <X>
    <Y>
      <file name="log.txt" size="10kb"/>
    </Y>
  </X>
</root>
2017年11月7日 17:04
編輯回答
柒槿年
def add_value(dict_obj, path, value):
  obj = dict_obj
  for i ,v in enumerate(path):
    if i + 1 == len(path):
      if not isinstance(obj.get(v, ''), list):
        obj[v] = list()
      obj[v].append(value)
      continue
    obj[v] = obj.get(v, '') or dict()
    obj = obj[v]
  return dict_obj

d = {}
print add_value(d, ['A', 'B', 'C'], ('output.txt', '2mb'))
print add_value(d, ['X', 'Y'], ('log.txt', '10kb'))
print add_value(d, ['A', 'B', 'C'], ('video.mp4', '2GB'))
2017年6月12日 17:39