如何重命名具有相应键值的字典中的值?

  • 本文关键字:字典 键值 重命名 python list
  • 更新时间 :
  • 英文 :


我有一个像这样的字典:

{
'6690_team': [6620, 6689], 
'6620_mdas': [6192, 6573], 
'6573_megan': [6535, 6572], 
'6572_regionalise national league north': [6567, 6570], 
'6570_sacha baron cohen': [6551, 6569], 
'6569_sacha baron cohen': [6380, 6568], 
'6568_first week': [6555, 6566]
}

如何使用对应键的名称重命名值?例如,密钥"6690_team"有两个值:"6620"one_answers"6689"。但是6620_mdas也是具有前缀6620的键,因此我想重命名具有该值作为前缀的第一个键的值(6690_team键数组中的6620)。

所以它会变成:

{
'6690_team': [6620_mdas, 6689]
}

这将发生在其他键上,所以最终的字典看起来像:

{
'6690_team': ['6620_mdas', '6569_sacha baron cohen'], 
'6620_mdas': [6192, '6573_megan'], 
'6573_megan': [6535, '6572_regionalise national league north'], 
'6572_regionalise national league north': [6567, '6570_sacha baron cohen'], 
'6570_sacha baron cohen': [6551, '6569_sacha baron cohen'], 
'6569_sacha baron cohen': [6380, '6568_first week'], 
'6568_first week': [6555, 6566]
}

尝试:

dct = {
"6690_team": [6620, 6689],
"6620_mdas": [6192, 6573],
"6573_megan": [6535, 6572],
"6572_regionalise national league north": [6567, 6570],
"6570_sacha baron cohen": [6551, 6569],
"6569_sacha baron cohen": [6380, 6568],
"6568_first week": [6555, 6566],
}
tmp = {int(k.split("_")[0]): k for k in dct}
for v in dct.values():
v[:] = [tmp.get(i, i) for i in v]
print(dct)

打印:

{
"6690_team": ["6620_mdas", 6689],
"6620_mdas": [6192, "6573_megan"],
"6573_megan": [6535, "6572_regionalise national league north"],
"6572_regionalise national league north": [6567, "6570_sacha baron cohen"],
"6570_sacha baron cohen": [6551, "6569_sacha baron cohen"],
"6569_sacha baron cohen": [6380, "6568_first week"],
"6568_first week": [6555, 6566],
}

最简单的方法是首先创建一个'反向查找'字典。

dx = {
'6690_team': [6620, 6689], 
'6620_mdas': [6192, 6573], 
'6573_megan': [6535, 6572], 
'6572_regionalise national league north': [6567, 6570], 
'6570_sacha baron cohen': [6551, 6569], 
'6569_sacha baron cohen': [6380, 6568], 
'6568_first week': [6555, 6566]
}
reverse_lookup_dx = {int(i.split("_")[0]): i for i in dx.keys()}

这有点密集,但它的作用是:

  • 对于每个元素(i)在原始字典的键…
  • 将该元素和split放在字符_上…
    • 对于6690_team, asplit("_")将导致' ['6690','team']
  • 然后取结果分割数组中的第一个元素。
    • 对于前面的例子,这将产生字符串'6690'
  • 然后将该值转换为int类型。
    • 字符串'6690'变为整型6690
  • 然后使用字典推导式创建一个int类型的键,该键指向string类型的值(原始键)。通过这种方式,您可以获取一个值并查找它对应的键-反向查找。

然后它就变成了一个简单的遍历字典:

final_dx = { key: 
[reverse_lookup_dx.get(item, item) for item in values] 
for key, values in dx.items()
}

这导致结果:

>>> from pprint import pprint
>>> pprint(final_dx)
{'6568_first week': [6555, 6566],
'6569_sacha baron cohen': [6380, '6568_first week'],
'6570_sacha baron cohen': [6551, '6569_sacha baron cohen'],
'6572_regionalise national league north': [6567, '6570_sacha baron cohen'],
'6573_megan': [6535, '6572_regionalise national league north'],
'6620_mdas': [6192, '6573_megan'],
'6690_team': ['6620_mdas', 6689]}

final_dx节结合了一个字典和一个列表推导式。我们所做的是通过遍历字典中的每个条目(for key, values in dx.items)来重新创建字典。

  • 对于每个字典项…
  • 遍历值列表…([... for item in values])
  • 对于每个条目,在反向字典(reverse_lookup_dx.get(item, ...))中查找
  • 如果找到,使用结果。如果不是,则使用提供的默认值—在本例中为itemget()函数允许您定义一个默认值—如果您在字典中没有找到该值,它将返回默认值。因此get(item, item)将在字典中查找条目,如果存在则返回对应键处的值…否则只返回原始值。

最新更新