根据特定条件重命名密钥

时间:2019-05-20 14:43:30

标签: python

我在处理字典时遇到问题:

我有一个带有这15个键的初始字典(dic_ONE):

'key_1', 'key_2', 'key_3', ...., 'key_15'

(但是键的总数可以在8到20之间变化)

如果它们的值不符合任何条件,我将删除其中一个或多个。 例如,我的最终字典(dic_TWO)将是:

'key_2', key_5', ...., 'key_14'

(删除4个键:key_1key_3key_4key_15之后)。

但是,这是我的问题,我现在想自动重命名剩下的每个键,使其数字以1(dic_THREE)开头:

'key_1', ..., 'key_11'.

'key_1'中的dic_THREE关联的值将是与key_2中的DIC_TWO关联的值。与'key_2'中的dic_THREE关联的值将是与key_5中的DIC_TWO关联的值,依此类推。

有人想这样做吗?

4 个答案:

答案 0 :(得分:0)

这就是我要这样做的方法,并确保“ key_2”在“ key_15”之前。即您不能只按字母顺序对其进行排序。

import re

digits = re.compile(r'(\d+)')

def mixnum_key_func(string):
    result = digits.split(string)
    for i in range(1, len(result), 2):
        result[i] = int(result[i])
    return result

def mixval(keyval):
    mixkey, mixval = keyval
    return mixnum_key_func(mixkey)

def reorder(keydic):
    return {'key_'+str(n): v for n, (_, v) in enumerate(sorted(keydic.items(), key=mixval), 1)}

测试:

dic_ONE = {'key_'+str(x):x for x in range(1,16)}

print(dic_ONE)

del(dic_ONE['key_4'])
del(dic_ONE['key_7'])

dic_TWO = reorder(dic_ONE)

print(dic_TWO)

输出:

{'key_1': 1, 'key_2': 2, 'key_3': 3, 'key_4': 4, 'key_5': 5, 'key_6': 6, 'key_7': 7, 'key_8': 8, 'key_9': 9, 'key_10': 10, 'key_11': 11, 'key_12': 12, 'key_13': 13, 'key_14': 14, 'key_15': 15}
{'key_1': 1, 'key_2': 2, 'key_3': 3, 'key_4': 5, 'key_5': 6, 'key_6': 8, 'key_7': 9, 'key_8': 10, 'key_9': 11, 'key_10': 12, 'key_11': 13, 'key_12': 14, 'key_13': 15}

答案 1 :(得分:0)

您需要在此处采取中间步骤以消除潜在的“缺口”。考虑一个虚构的示例,在该示例中,我们只希望具有等于或大于100的整数的值:

first_dict = {'key_1': 100, 'key_2': -100, 'key_3': 1000, 'key_4': 'abc', 'key_5': 101}

intermediate = sorted(
                [(key, value)
                    for key, value in first_dict.items()
                    if isinstance(value, int) and value >= 100],
                key = lambda x: x[0].split("_")[1])

intermediate = [("key_{}".format(index), value[1])
                for index, value in enumerate(intermediate, 1)]

output = dict(intermediate)
print(output)

这会产生

{'key_1': 100, 'key_2': 1000, 'key_3': 101}

在可能的情况下,请考虑重构代码,而不是首先使用列表。拥有“ key_x”之类的键是没有意义的,因为它们在字典中仍然会无序显示。

答案 2 :(得分:0)

d = {'key_2':32, 'key_3' : 43, 'key_27' : 43}
d = { 'key_' + str(k) : v[1] for k,v in enumerate(d.items(),1)}
print (d)    

输出:

{'key_1': 32, 'key_2': 43, 'key_3': 43}

答案 3 :(得分:0)

感谢您的帮助!阅读完您所有的第一个答案后,我执行了此功能,从而得到了想要的结果:

def renomme_cles(dic):
    dic_renomme = {}
    liste_cles_dic = dic.keys()
    liste_numeros_dic = []
    for cle in liste_cles_dic :
        num_cle = cle.split('_')[-1]
        liste_numeros_dic.append(int(num_cle))
    liste_numeros_dic = sorted(liste_numeros_dic)
    l1 = range(len(liste_numeros_dic))
    l2 = []
    for i in l1 :
        l2.append(i+1)
    for num in liste_numeros_dic :
        old_cle = 'key_' + str(num)
        new_cle = 'key_' + str(l2[liste_numeros_dic.index(num)])
        dic_renomme[new_cle] = dic[old_cle]
    return dic_renomme