python:检查一个键中的一定数量的字符是否与同一个字典中另一个键的字符匹配

时间:2017-08-24 13:20:45

标签: python dictionary indexing

我有以下字典:

dic_raw={'M.ESE18.COFMSDM01V.MW.IT':{'initiativeType': 'Activation', 'initiativeName': 'Campaign1'},'M.ESE18.COFMSDM01V.MN.ML':{'initiativeType': 'Revokation', 'initiativeName': 'Campaign 2'},'M.ESE18.COFMSDM01V.CI.CR':{'initiativeType': 'Stratification', 'initiativeName': 'Campaign 3'},'M.ESE18.COFMSDM01A.OP.TA':{'initiativeType': 'Activation', 'initiativeName': 'Campaign 5'}, 'N.ESE18.FFFMSDM01A.NS.TA':{'initiativeType': 'Activation', 'initiativeName': 'Campaign 6'}, 'N.ESE18.FFFMSDM01A.OP.TA':{'initiativeType': 'Activation', 'initiativeName': 'Campaign 4'}}  

我需要的是创建另一个词典( dic_new ),其信息与 dic_raw 相同+ +键的另一个深度级别。 dic_new 中的新关键字段来自初始 dic_raw 中任意键的前18个匹配字符,其值应为嵌套字典" old" 18个匹配键+所有"旧"值。

像这样:

dic_new={'M.ESE18.COFMSDM01V': {'M.ESE18.COFMSDM01V.MW.IT': {'initiativeType': 'Activation', 'initiativeName': 'Campaign 1'}, 'M.ESE18.COFMSDM01V.MN.ML': {'initiativeType': 'Revokation', 'initiativeName': 'Campaign 2'}, 'M.ESE18.COFMSDM01V.CI.CR': {'initiativeType': 'Stratification', 'initiativeName': 'Campaign 3'}}, 'N.ESE18.FFFMSDM01A':{'N.ESE18.FFFMSDM01A.NS.TA': {'initiativeType': 'Activation', 'initiativeName': 'Campaign 6'}, 'N.ESE18.FFFMSDM01A.OP.TA': {'initiativeType': 'Activation', 'initiativeName': 'Campaign 4'}}, 'M.ESE18.COFMSDM01A':{'M.ESE18.COFMSDM01A.OP.TA':  {'initiativeType': 'Activation', 'initiativeName': 'Campaign 5'}}}

例如:

  • 第一个键' M.ESE18.COFMSDM01V .MW.IT'将与初始字典中的所有其他键进行比较
  • 因为字典中其他2个键的前18个字符相同(&#39; M.ESE18.COFMSDM01V .MN.ML&#39;,&#39; < strong> M.ESE18.COFMSDM01V .CI.CR&#39;),然后
  • M.ESE18.COFMSDM01V (3把钥匙的共同部分)将成为新的&#34;顶级&#34;新词典中的键,匹配的2个键现在变成了嵌套词典的值

因此

 M.ESE18.COFMSDM01V.MW.IT:{'initiativeType': 'Activation','initiativeName': 'Campaign 1'}
 M.ESE18.COFMSDM01V.MN.ML:{'initiativeType': 'Revokation','initiativeName': 'Campaign 2'}

应该成为

M.ESE18.COFMSDM01V:{'M.ESE18.COFMSDM01V.MW.IT': {'initiativeType': 'Activation', 'initiativeName': 'Campaign 1'},'M.ESE18.COFMSDM01V.MN.ML': {'initiativeType': 'Revokation', 'initiativeName': 'Campaign 2'}}

提及:

  • 多个初始密钥会出现多种情况 有共同的字符,因此需要包括在一个 新的顶级密钥,但我不知道哪个或多少
  • 字典中的某些键将是完全唯一的(就前18个字符而言),但我仍然需要为新词典中的那些创建相同的结构

我在编程方面非常陌生,所以我尝试过多种方式解决问题,但我真的找不到解决方案。我相信我无法将问题正确地分解成单独的部分(以逐个字符的可转换方式找到匹配的键 - 不知道如何在字典中这样做我所需要的将键移动到一个列表,但后来我不知道如何正确地进行比较,然后将我需要的部分移动到一个新的dict,同时还复制为嵌套的dicts它的旧匹配值等。)

欢迎任何帮助!

2 个答案:

答案 0 :(得分:3)

轻松实现这一目标的方法:

dic_new = {}
for key, value in dic_raw.iteritems():
    dic_new.setdefault(key[:18], {}).setdefault(key, value)

答案 1 :(得分:0)

试试这个:

dic_new={}
for k in dic_raw:
    nk = k[:18]
    if not nk in dic_new:
        dic_new[nk]={}
    dic_new[nk][k] = dic_raw[k]