【问题标题】:how to group new dictionaries by using common strings from my dictionary如何使用我的字典中的常用字符串对新字典进行分组
【发布时间】:2017-08-24 20:25:09
【问题描述】:

参考我之前的问题:How to extract the common words before particular symbol and find particular word

mydict = {"g18_84pp_2A_MVP1_GoodiesT0-HKJ-DFG_MIX-CMVP1_Y1000-MIX.txt" : 0,
          "g18_84pp_2A_MVP2_GoodiesT0-HKJ-DFG_MIX-CMVP2_Y1000-MIX.txt" : 1,
          "g18_84pp_2A_MVP3_GoodiesT0-HKJ-DFG_MIX-CMVP3_Y1000-MIX.txt" : 2,
          "g18_84pp_2A_MVP4_GoodiesT0-HKJ-DFG_MIX-CMVP4_Y1000-MIX.txt" : 3,
          "g18_84pp_2A_MVP5_GoodiesT0-HKJ-DFG_MIX-CMVP5_Y1000-MIX.txt" : 4,
          "g18_84pp_2A_MVP6_GoodiesT0-HKJ-DFG_MIX-CMVP6_Y1000-MIX.txt" : 5,
          "h18_84pp_3A_MVP1_GoodiesT1-HKJ-DFG-CMVP1_Y1000-FIX.txt" : 6,
          "g18_84pp_2A_MVP7_GoodiesT0-HKJ-DFG_MIX-CMVP7_Y1000-MIX.txt" : 7,
          "h18_84pp_3A_MVP2_GoodiesT1-HKJ-DFG-CMVP2_Y1000-FIX.txt" : 8,
          "h18_84pp_3A_MVP3_GoodiesT1-HKJ-DFG-CMVP3_Y1000-FIX.txt" : 9,
          "p18_84pp_2B_MVP1_GoodiesT2-HKJ-DFG-CMVP3_Y1000-FIX.txt" : 10}

我已经得到了我的 OutputNameDict,

OutputNameDict = {'h18_84pp_3A_MVP_FIX': 1, 'p18_84pp_2B_MVP_FIX': 2, 'g18_84pp_2A_MVP_MIX': 0}

现在我要做的是使用我的常用字符串 CaseNameString(请参阅上一个问题)和 OutputNameDict 中的值对三个新字典进行分组。

想法结果会是这样的:

组 1。 mydict0 在OutputNameDict 中使用值0,在CaseNameString 中使用字符串g18_84pp_2A_MVP_GoodiesT0。

mydict0 = {"g18_84pp_2A_MVP1_GoodiesT0-HKJ-DFG_MIX-CMVP1_Y1000-MIX.txt" : 0,               
           "g18_84pp_2A_MVP2_GoodiesT0-HKJ-DFG_MIX-CMVP2_Y1000-MIX.txt" : 1,
           "g18_84pp_2A_MVP3_GoodiesT0-HKJ-DFG_MIX-CMVP3_Y1000-MIX.txt" : 2,
           "g18_84pp_2A_MVP4_GoodiesT0-HKJ-DFG_MIX-CMVP4_Y1000-MIX.txt" : 3,
           "g18_84pp_2A_MVP5_GoodiesT0-HKJ-DFG_MIX-CMVP5_Y1000-MIX.txt" : 4,
           "g18_84pp_2A_MVP6_GoodiesT0-HKJ-DFG_MIX-CMVP6_Y1000-MIX.txt" : 5,
           "g18_84pp_2A_MVP7_GoodiesT0-HKJ-DFG_MIX-CMVP7_Y1000-MIX.txt" : 6}

组 2。 mydict1 在OutputNameDict 中使用值1,在CaseNameString 中使用字符串h18_84pp_3A_MVP_GoodiesT1。

mydict1 ={"h18_84pp_3A_MVP1_GoodiesT1-HKJ-DFG-CMVP1_Y1000-FIX.txt" : 0,
          "h18_84pp_3A_MVP2_GoodiesT1-HKJ-DFG-CMVP2_Y1000-FIX.txt" : 1,
          "h18_84pp_3A_MVP3_GoodiesT1-HKJ-DFG-CMVP3_Y1000-FIX.txt" : 2}

组 3。 mydict2 在OutputNameDict 中使用值2,在CaseNameString 中使用字符串p18_84pp_2B_MVP_GoodiesT2。

mydict2 ={"p18_84pp_2B_MVP1_GoodiesT2-HKJ-DFG-CMVP3_Y1000-FIX.txt" : 0}

有什么建议吗?有什么函数可以调用吗?

【问题讨论】:

    标签: python string dictionary grouping


    【解决方案1】:

    我会将您的 OutputNameDict 键更改为正则表达式模式,如下所示:

    OutputNameDict = {'h18_84pp_3A_MVP.*FIX': 1, 'p18_84pp_2B_MVP.*FIX': 2, 'g18_84pp_2A_MVP.*MIX': 0}
    

    然后,使用re正则表达式模块,使用它来匹配mydict中的键,并将字典元素放入output_dicts字典中的相应键中,如下所示

    import collections
    import re
    output_dicts = collections.defaultdict(dict)
    
    for k, v in mydict.iteritems():
        for pattern, suffix in OutputNameDict.iteritems():
            if re.match(pattern,k):
                output_dicts['mydict' + str(suffix)][k] = v
                break
        else:
            output_dicts['not matched'][k] = v
    

    这导致output_dicts 字典填充如下

    for k, v in output_dicts.iteritems():
        print k
        print v
        print
    

    哪些输出

    mydict1
    {'h18_84pp_3A_MVP2_GoodiesT1-HKJ-DFG-CMVP2_Y1000-FIX.txt': 8, 
     'h18_84pp_3A_MVP3_GoodiesT1-HKJ-DFG-CMVP3_Y1000-FIX.txt': 9, 
     'h18_84pp_3A_MVP1_GoodiesT1-HKJ-DFG-CMVP1_Y1000-FIX.txt': 6}
    
    mydict0
    {'g18_84pp_2A_MVP1_GoodiesT0-HKJ-DFG_MIX-CMVP1_Y1000-MIX.txt': 0,
     'g18_84pp_2A_MVP2_GoodiesT0-HKJ-DFG_MIX-CMVP2_Y1000-MIX.txt': 1, 
     'g18_84pp_2A_MVP4_GoodiesT0-HKJ-DFG_MIX-CMVP4_Y1000-MIX.txt': 3, 
     'g18_84pp_2A_MVP5_GoodiesT0-HKJ-DFG_MIX-CMVP5_Y1000-MIX.txt': 4, 
     'g18_84pp_2A_MVP3_GoodiesT0-HKJ-DFG_MIX-CMVP3_Y1000-MIX.txt': 2, 
     'g18_84pp_2A_MVP6_GoodiesT0-HKJ-DFG_MIX-CMVP6_Y1000-MIX.txt': 5, 
     'g18_84pp_2A_MVP7_GoodiesT0-HKJ-DFG_MIX-CMVP7_Y1000-MIX.txt': 7}
    
    mydict2
    {'p18_84pp_2B_MVP1_GoodiesT2-HKJ-DFG-CMVP3_Y1000-FIX.txt': 10}
    

    【讨论】:

    • @mtadd如果我匹配到 GoodiesT0,GoodiesT1 和 GoodiesT2,表达式 OutputNameDict ={'h18_84pp_3A_MVP.*_GoodiesT1.*FIX': 1, 'p18_84pp_2B_MVP.*_GoodiesT2.*FIX': 2, 'g18_84pp_2A_MVP.*_GoodiesT0.*MIX': 0} 对我来说很有效。
    • 正则表达式非常灵活,可以根据您的指定具体或贪婪地捕获。为了调试,我还考虑在内部 for 循环中添加一个 else 子句,以将 mydict 中与您的正则表达式之一不匹配的任何条目放入 output_dicts 中的“不匹配”字典条目中,我'将作为示例添加到答案中。
    • 还有一个问题。如果我想要mydict0、mydict1 和mydict2 的值从0 开始然后跟随1、2、3...
    • 字典出于性能原因无序存储数据。如果要按顺序显示项目,可以使用sorted 方法,例如sorted(mydict.iteritems(),key=lambda x: x[1])
    • 谢谢。这对我很有用。
    猜你喜欢
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多