如何使用通配符循环python字典键?

时间:2014-06-29 21:24:11

标签: wildcard

我创建了一个字典,并在其中循环创建一个最终的,更小的字典。我已经成功地做到了这一点,但它很漫长而且很麻烦。在我看来,我应该能够使用某种通配符循环。我的问题是我正在使用用户输入,但有些键可以是a,a_1,a_2,... a_5。并非所有选项都有5个可选项,有些只有一个。请善待,我是编程新手。我试过fnmatch()函数无济于事。

check_parm=yae_list.values() 
new_dict={}
x=int(len(check_parm))
while x>0:
    element=check_parm[x-1]
    if element in yae_atom_parms_dic:
        new_dict[element]=yae_atom_parms_dic.get(element)
    elif not yae_atom_parms_dic.get(element):
        element_1=element+'_1'
        if element_1 in yae_atom_parms_dic:     
            new_dict[element_1]=yae_atom_parms_dic.get(element_1)   
        element_2=element+'_2'
        if element_2 in yae_atom_parms_dic:     
            new_dict[element_2]=yae_atom_parms_dic.get(element_2)
        element_3=element+'_3'
        if element_3 in yae_atom_parms_dic:
            new_dict[element_3]=yae_atom_parms_dic.get(element_3)
        element_4=element+'_4'
        if element_4 in yae_atom_parms_dic:
            new_dict[element_4]=yae_atom_parms_dic.get(element_4)
        element_5=element+'_5'
        if element_5 in yae_atom_parms_dic:
            new_dict[element_5]=yae_atom_parms_dic.get(element_5)
        if element_1 or element_2 or element_3 or element_4 or element_5:
            print("Which one do you want?")
            print new_dict
    x=x-1

这是我想要的,给出输出:

Which one do you want?
{'C_1': (6, 4, 1, 2, 's', -21.4, 1.625, 0, 1, 0), 'C_2': (6, 4, 1, 2, 'p', -11.4,1.625,)}

1 个答案:

答案 0 :(得分:0)

可以尝试这样的事情:

import re

constant_keys = "|".join(map(re.escape, yae_list.values()))
re_expression = re.compile("^(%s)(_[1-5])?$" % constant_keys)
allowed_keys = filter(re_expression.match, yea_atom_parms_dic.keys())
new_dict = {key: yea_atom_parms_dic[key] for key in allowed_keys}

print new_dict

在这个中,首先通过将所有yae_list键连接起来构造正则表达式字符(并转义它们)然后你将这样的表达式放入^(%s)(_ [1-5])?这意味着当键与|中的任何键相等时,将匹配匹配序列可选地带有下划线和1到5之间的数字。接下来,您可以过滤允许的键并使用它们,您可以使用allowed_keys列表中的键创建新的dict。

示例:

如果您有密钥:“C”,“a”和“new”,那么正则表达式将如下所示:^(C|a|new)(_[1-5])?$