我有一个像这样的字典:
{
'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, ...)
)中查找 - 如果找到,使用结果。如果不是,则使用提供的默认值—在本例中为
item
。get()
函数允许您定义一个默认值—如果您在字典中没有找到该值,它将返回默认值。因此get(item, item)
将在字典中查找条目,如果存在则返回对应键处的值…否则只返回原始值。