复制具有重复键的词典?

2024-07-04 08:42:33 发布

您现在位置:Python中文网/ 问答频道 /正文

在过去的六个多小时里,我一直在努力解决这个问题,但我一直在尝试迭代和切分字典中的所有键,同时保留值并将所有项转移到新字典中

new_dictionary = {}
current_dictionary = {"XXXX1234":43, "XXXX4547":58, "YYYY4948":93, "YYYY5050":45} 
for key,value in current_dictionary.items():
  if current_dictionary not in new_dictionary:
    new_dictionary.update({key[0:4]:value})
print(new_dictionary)

结果应该是

{"XXXX":43, "XXXX":58, "YYYY":93, "YYYY":45}

相反,我得到了这个

{"XXXX":58, "YYYY":45} 

我不想试着把它转换成一个列表并在那里切分,但我想找到一个直接的方法,在过去的一个下午我一直在绞尽脑汁


Tags: keyinnewdictionary字典valuecurrent小时
3条回答

|=运算符(Python3.9)

我认为|=操作符被称为单管等于操作符,您可以使用它来组合字典。这会将“右”和“右”中的所有条目添加到“左”中,作为平局断路器

ids = {"XXXX1234": 43, "XXXX4547": 58, "YYYY4948": 93, "YYYY5050": 45} 
updates = {"XXXX6666": 00, "YYYY5050": 99} # "YYYY5050" is duplicate
updates |= ids # pick right when duplicate key
print(updates)

输出:

{'XXXX1234': 43, 'XXXX4547': 58, 'YYYY4948': 93, 'XXXX6666': 00, 'YYYY5050': 45}

通常像len(updates)这样的增量数据比像len(ids)这样的完整数据要短。以这种方式使用|=将每次复制所有ids,而不是复制所有updates如果被写为ids |= updates

唯一键

正如其他人所指出的,您将需要唯一的密钥。这使用4位尾部作为解决方法:

ids = {"XXXX1234": 43, "XXXX4547": 58, "YYYY4948": 93, "YYYY5050": 45} 
new_ids = {key[-4:]: ids[key] for key in ids}
print(new_ids)

输出:

{'1234': 43, '4547': 58, '4948': 93, '5050': 45}

字典中的键是唯一的。
如果需要,可以在其中放入多个值,但每个键都必须是唯一的,因此如果再次插入,新值将覆盖该键

您可以使用列表来存储与同一个键关联的多个值。见下文:

>>> current_dictionary = {"XXXX1234":43,"XXXX4547":58, "YYYY4948":93,"YYYY5050":45} 
>>> new_dictionary = {}
>>> for key, value in current_dictionary.items():
...     new_dictionary.setdefault(key[0:4], []).append(value)
... 
>>> print(new_dictionary)
{'XXXX': [43, 58], 'YYYY': [93, 45]}
>>> 

你不能在字典里放重复的键。但不是错误信息, Python将在重复键的旧值之上写入新值。 考虑结果 此片段(如问题中所述,但在这里,我手动分割了每个键):

current_dictionary = {"XXXX1234":43, "XXXX4547":58, "YYYY4948":93, "YYYY5050":45}
print(current_dictionary)
# {'XXXX1234': 43, 'XXXX4547': 58, 'YYYY4948': 93, 'YYYY5050': 45}
new_dictionary = {"XXXX":43, "XXXX":58, "YYYY":93, "YYYY":45}
print(new_dictionary)
# {'XXXX': 58, 'YYYY': 45}

注意new_dictionary的打印显示了 原版词典。此外,如果您使用的是IDE(我使用Spyder),则 checker/linter将在new_dictionary所在的行上发出警告 创造

现在,您如何在检测复制的同时编写此代码? 请在最后一节中尝试以下内容:

new_dictionary = {}
for key,value in current_dictionary.items():
    if key[0:4] not in new_dictionary:
        new_dictionary[key[0:4]] = value
    else:
        print(f"Duplicate key {key[0:4]} with value {value}")
print(new_dictionary)
# Duplicate key XXXX with value 58
# Duplicate key YYYY with value 45
# {'XXXX': 43, 'YYYY': 93}

相关问题 更多 >

    热门问题