使用列表中的相应替换嵌套dict中的元素

时间:2017-11-17 10:55:43

标签: python iteration

我有下面的词典和列表。

mylist= ['1H1.PyModule.md',
         '1H2.Class.md',
         '1H3.MetaObject.md',
         '2B1D0.Data.md',
         '2B1D1.Primitive.md',
         '2B1D2.Operator.md',
         '2B2D3.Container.md',
         '2B2S0.Function.md',
         '2B2S0.Statemment.md',
         '2B2S1.Controlled_Loop.md',
         '2B2S2.Conditions.md',
         '2B2S3.Except.md',
         ...
         ]
 mydict = {'Body': {'Data': ['1.primitive', '2.operator', '3.container'],
   'Statement': ['0.function', '1.controlled_loop', '2.condition', '3.except']},
   'Header': ['1.Modle', '2.Class', '3.Object'],
   ...}

我尝试使用mydict中的相应内容重新mylist中的字符串

我可以发现'2B1D0.Data.md'的长度最短, 所以我切入了关键数据'

In [82]: '2B1D0.Data.md'[-7:-3]
Out[82]: 'Data'

dict有嵌套列表和嵌套字典 所以我用type checking写了一个迭代函数 如果项目的值为isinstance(value,list),则续订该值,
如果项目的值为isinstance(value, dict),请调用函数replace_ele()继续。

我将mylist中的字符串命名为str_of_list, 而mydict中的字符串为str_of_dict,表示可读问题。

#replace one string in mydict
def replace_ele(mydict, str_of_list):
    for key, value in mydict.items():
        if isinstance(value, list): #type checking
            for str_of_dict in value:
                #replace str_of_dict with str_of_list
                if str_of_list[-7:-3].lower() == str_of_dict[-4:]: #[-7:-3] the shortest length
                    value.remove(str_of_dict)
                    value.append(str_of_list)
                    value.sort()
                    mydict[key] = value
        #iteration if a dict
        if isinstance(value, dict):
            replace_ele(value,str_of_list)

for str_of_list in mylist:
    replace_ele(mydict, str_of_list)

然后运行并输出:

Out[117]:
{'Body': {'Data': ['2B1D1.Primitive.md',
   '2B1D2.Operator.md',
   '2B2D3.Container.md'],
  'Statement': ['2B2S0.Function.md',
   '2B2S0.Function.md',
   '2B2S1.Controlled_Loop.md',
   '2B2S3.Except.md']},
 'Header': ['1.Modle', '1H2.Class.md', '1H3.MetaObject.md']
 ....}

我认为用较少的代码可以解决这样的问题。  但是,由于知识有限,我无法找到解决方案。

如何优雅地完成它?

1 个答案:

答案 0 :(得分:2)

我的建议是你创建一个函数来将$(function() { $.ajax({ url: "www.domain.com/iframe", dataType: "jsonp", timeout: 5000, success: function () { $("#iframe").attr("src", "www.domain.com/iframe"); }, error: function (parsedjson) { if(parsedjson.status == "200") { $("#iframe").attr("src", "www.domain.com/iframe"); } else { // Handle error } } }); }); 的元素和mylist值列表中的元素减少为相同的格式:

例如,您可以按mydict字符拆分,取第二个字段,将其转换为小写:

'.'

E.g:

def f(s):
    return s.split('.')[1].lower()

现在,从>>> f('2B2S1.Controlled_Loop.md') 'controlled_loop' >>> f('1.controlled_loop') 'controlled_loop' 创建一个dict来保存替换:

mylist

即。 mylist_repl={f(x): x for x in mylist} 包含mylist_repl项,例如key: value

使用dict 'metaobject': '1H3.MetaObject.md'和函数mylist_repl,可以很容易地将列表从f转换为所需的值,例如:

mydict

另请注意,此字典查找比嵌套for循环更有效(即:更快)!

如果您有不同的替换逻辑,您可能只需要更改>>> [mylist_repl[f(x)] for x in ['1.primitive', '2.operator', '3.container']] ['2B1D1.Primitive.md', '2B1D2.Operator.md', '2B2D3.Container.md'] 将项目从两个不同的集合映射到公共密钥的方式。