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

python:检查一个键中的特定数量的字符是否与同一字典中另一个键的字符匹配,python,dictionary,indexing,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': 'Str

我有以下字典:

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个匹配字符,其值应该是匹配键的“旧”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.cofsdm01vMW.IT”将与初始字典中的所有其他键进行比较
  • 因为它的前18个字符在字典中的其他两个键(“M.ESE18.COFMSDM01V.MN.ML”,“M.ESE18.COFMSDM01V.CI.CR”)中是相同的,所以
  • M.ESE18.cofmsm01v(3个键的公共部分)将成为新dict中的新“顶级”键,匹配的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中找到它,所以我需要将键移动到一个列表中,但后来我被困在如何正确地进行比较上,然后将我需要的部分移动到一个新dict,同时也作为嵌套dict复制它的旧匹配值,等等。)


如果您有任何帮助,我们将不胜感激!

一个简单的方法:

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

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]

维吉尼,非常感谢!你能帮我写几句话来帮助我理解你是怎么想这个问题的吗?没问题,你想用钥匙的前18个字符来分组钥匙,所以你需要在新的dic中添加这些信息(dic_new)函数setdefault允许在一行中定义字典中的新键并简化脚本。例如,如果该键不存在,则使用字典{}创建该键默认情况下,如果密钥存在,请使用密钥,您还有其他问题吗?同样有效,谢谢!如果您能帮助我了解您的想法,我将非常感激。对于旧列表中的每个项目,如果它在新列表中不存在,请创建它,然后将额外的数据附加到新列表中新创建的项目。这是一个比较常见的问题xercise在编程方面,所以我认为这是一件你只需要看到其他人做一次,然后它就是你腰带上的另一个工具的事情。似乎你已经充分定义了问题/要求-下一步将是在纸上写下过程(步骤)您需要采取措施来完成任务,然后尝试将这些步骤转换为伪代码,最后是Python代码。