我有下面的词典和列表。
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']
....}
我认为用较少的代码可以解决这样的问题。 但是,由于知识有限,我无法找到解决方案。
如何优雅地完成它?
答案 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']
将项目从两个不同的集合映射到公共密钥的方式。