我在处理字典时遇到问题:
我有一个带有这15个键的初始字典(dic_ONE
):
'key_1', 'key_2', 'key_3', ...., 'key_15'
(但是键的总数可以在8到20之间变化)
如果它们的值不符合任何条件,我将删除其中一个或多个。
例如,我的最终字典(dic_TWO
)将是:
'key_2', key_5', ...., 'key_14'
(删除4个键:key_1
,key_3
,key_4
和key_15
之后)。
但是,这是我的问题,我现在想自动重命名剩下的每个键,使其数字以1(dic_THREE
)开头:
'key_1', ..., 'key_11'.
与'key_1'
中的dic_THREE
关联的值将是与key_2
中的DIC_TWO
关联的值。与'key_2'
中的dic_THREE
关联的值将是与key_5
中的DIC_TWO
关联的值,依此类推。
有人想这样做吗?
答案 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