在字典中列出,在Python中循环

Ter*_*row 3 python dictionary list

我有以下代码:

    TYPES = {'hotmail':{'type':'hotmail', 'lookup':'mixed', 'dkim': 'no', 'signatures':['|S|Return-Path: postmaster@hotmail.com','|R|^Return-Path:\s*[^@]+@(?:hot|msn)','^Received: from .*hotmail.com$']},
             'gmail':{'type':'gmail', 'lookup':'mixed', 'dkim': 'yes', 'signatures':['|S|Subject: unsubscribe','','','']}
            }

    for type_key, type in TYPES.iteritems():
        for sub_type_key, sub_type in type.iteritems():
            for sig in sub_type['signatures']:
                if ("|S|" in sig):
                    #String based matching
                    clean_sig = sig[3:len(sig)]
                    if (clean_sig in file_contents):
                        sig_match += 1
                elif ("|R|" in sig):
                    clean_sig = sig[3:len(sig)]
                    #REGMATCH later
            if (sig_match == sig.count):
                return sub_type['type']

     return None
Run Code Online (Sandbox Code Playgroud)

但是,它会生成错误:

for sig in sub_type['signatures']:
TypeError: string indices must be integers, not str
Run Code Online (Sandbox Code Playgroud)

我假设它会看到列表从字典元素中拉出来,并允许我循环它?

Python新手是一个新手:(

ret*_*ile 7

for type_key, type in TYPES.iteritems():
    for sub_type_key, sub_type in type.iteritems():
        for sig in sub_type['signatures']:
Run Code Online (Sandbox Code Playgroud)

应该:

for type_key, type in TYPES.iteritems():
        for sig in type['signatures']:
Run Code Online (Sandbox Code Playgroud)

但是'type'在这种情况下是一个糟糕的名字选择...你不想暗示内置.

基本上,'type_key'具有名称('hotmail'或'gmail'),'type'具有与该键相关联的值的字典.所以输入['signatures']就是你想要的.

此外,您可能不需要在嵌套字典中包含"gmail"; 只返回'type_key'而不是type['type'].

将它们整合在一起,也许这会更好:(警告:未经测试)

providers = {
    'hotmail':{
        'type':'hotmail',
        'lookup':'mixed',
        'dkim': 'no',
        'signatures':[
            '|S|Return-Path: postmaster@hotmail.com',
            '|R|^Return-Path:\s*[^@]+@(?:hot|msn)',
            '^Received: from .*hotmail.com$']
    },
    'gmail':{
        'type':'gmail',
        'lookup':'mixed',
        'dkim': 'yes',
        'signatures':['|S|Subject: unsubscribe','','','']
    }
}

for provider, provider_info in providers.iteritems():
    for sig in provicer_info['signatures']:
        if ("|S|" in sig):
            #String based matching
            clean_sig = sig[3:len(sig)]
            if (clean_sig in file_contents):
                sig_match += 1
        elif ("|R|" in sig):
            clean_sig = sig[3:len(sig)]
            #REGMATCH later
    if (sig_match == sig.count):
        return provider

 return None
Run Code Online (Sandbox Code Playgroud)