如何解决嵌套字典的迭代以查找相似的值,然后使用相同的键将其添加到字典列表中
CSV文件被放入networkx图形,并迭代为以下格式。 这是我用来遍历字典的代码。
diction = {
"1234":{
"name":"XYZ","rollNo":"2","marks":"40"
},"2122":{
"name":"XYZ","marks":"60"
}
}
new_dict = {}
key_list = []
for key,values in diction.items():
if key not in key_list:
name = values['name']
rollNo = values['rollNo']
for k,v in diction.items():
if k not in key_list:
key_list.append(key)
key_list.append(k)
if name == v['name'] and rollNo == v['rollNo']:
if (k,key) not in key_list:
new_dict.setdefault(key,[]).append(v)
elif key in key_list:
new_dict[key].append(v)
elif k in key_list:
new_dict[k].append(v)
else:
new_dict.setdefault(key,[]).append(v)
print(new_dict)
输入:
{
"1234":{
"name":"XYZ","marks":"60"
}
}
输出:
{
"1234":[{
"name":"XYZ","marks":"40"
},{
"name":"XYZ","marks":"60"
}]
}
我有5M密钥需要检查。 由于时间复杂度为n ^ n,因此我目前正在for那里花费大量时间。 想要一个优化的解决方案。
解决方法
除了代码的算法结构外,我还发现代码的一个主要问题。在key_list.append(key)
和key_list.append(k)
两行中,假设key_list
保留string
值。但是稍后在if (k,key) not in key_list
中,您假设key_list
保留tuple
个值(string
对)。因此在我看来,该测试将始终被评估为True
。
如果我正确理解了您的问题,那么这可能会解决您的问题(至少会为您的示例产生所需的输出):
diction = {
"1234":{
"name":"XYZ","rollNo":"2","marks":"40"
},"2122":{
"name":"XYZ","marks":"60"
}
}
new_dict = {}
attrib = {} # a dictionary mapping (name,rollNo) to diction keys
for key,values in diction.items():
name = values['name']
rno = values['rollNo']
if (name,rno) not in attrib: # couple (name,rollNo) unseen so far
new_dict[key] = [values]
attrib[(name,rno)] = key # record the association(name,rollNo) <-> key
else: # couple (name,rollNo) already seen
new_dict[attrib[(name,rno)]].append(values)
print(new_dict)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。