Python 比较字典值并整理一些
我有一个字典,其中包含一个随机生成的键(例如mApd12iX6V1zrUtn)和一个列表中存储的三个值(例如[8235838627174979])。这三个值是质量、x坐标和y坐标。我想比较字典中每个项目/对象的所有坐标,如果这些坐标彼此相差达10,则将它们合并 我试图在嵌套循环中迭代字典Python 比较字典值并整理一些,python,dictionary,comparison,Python,Dictionary,Comparison,我有一个字典,其中包含一个随机生成的键(例如mApd12iX6V1zrUtn)和一个列表中存储的三个值(例如[8235838627174979])。这三个值是质量、x坐标和y坐标。我想比较字典中每个项目/对象的所有坐标,如果这些坐标彼此相差达10,则将它们合并 我试图在嵌套循环中迭代字典 new_obj_list = {} for item in obj_list: new_obj_list[item] = obj_list[item] for item in obj_list:
new_obj_list = {}
for item in obj_list:
new_obj_list[item] = obj_list[item]
for item in obj_list:
for item1 in obj_list:
if item != item1 and obj_list[item][1]-10 < obj_list[item1][1] < obj_list[item][1]+10:
new_mass = obj_list[item1][0] + obj_list[item][0]
new_posx = obj_list[item][1]
new_posy = obj_list[item][2]
new_data = [new_mass, new_posx, new_posy]
new_obj_list[item] = new_data
if item != item1 and obj_list[item][2]-10 < obj_list[item1][2] < obj_list[item][2]+10:
new_mass = obj_list[item1][0] + obj_list[item][0]
new_posx = obj_list[item][1]
new_posy = obj_list[item][2]
new_data = [new_mass, new_posx, new_posy]
new_obj_list[item] = new_data
print(len(obj_list))
print(len(new_obj_list))
new_obj_list={}
对于obj_列表中的项目:
新建对象列表[项目]=对象列表[项目]
对于obj_列表中的项目:
对于obj_列表中的项目1:
如果项目!=项目1和obj_列表[项目][1]-10
对象列表的长度与新对象列表的长度相同。我希望新的对象列表比对象列表小得多,因为只有已排序的项才能存储在新的对象列表中。合并两个项时,需要删除未覆盖的项 覆盖由“item”键控的任何列表,但不删除由“item1”键控的任何列表,因此在遍历字典后,最终得到相同数量的键
或者,您可以将新的目录初始化为空目录,而不是在进行任何组合之前从目录中复制项目。当然,长度与旧词典相同!您正在处理(在第一个循环中)它并修改某些元素(在第二个循环中)!您应该将新字典保留为空,并附加新元素 此外,我不知道它是否会有很大的变化,但我建议用这种方式计算您的距离:
#remove first copy loop
#inside your double for loop do:
dSQ = (old_dict[item][1] - old_dict[item1][1])**2 + (old_dict[item][2] - old_dict[item1][2])**2
if dSQ < 10**2:
#combine your objects as you did before
new_dict[item1] = new_data
#删除第一个复制循环
#在双for循环中,请执行以下操作:
dSQ=(旧目录[项目][1]-旧目录[项目1][1])**2+(旧目录[项目][2]-旧目录[项目1][2])**2
如果dSQ<10**2:
#像以前一样组合对象
新建目录[item1]=新建目录数据
要么是我做错了,要么是将新的对象列表初始化为空的dict根本不起作用。我认为我的分类语句不能像预期的那样工作。如果我将dict初始化为空,我得到的结果与之前完全相同。你能给出一个小测试用例,给出一个错误的输出,并包括你期望的输出吗?obj_list={'iMbvRx9ws3gAut4Lkl4':[3244532434333],'7Lt3f0aARp5uV':[2314324435000]}我期望它们结合起来,因为x坐标在10的范围内。因此,我的预期输出将是obj_list={“iMbvRx9ws3gAut4Lkl4”:[2638777], 好吧,我想你的问题是你在内外循环中循环所有的项目。因此,对于上面的示例,您可以将第一项与第二项进行比较,并将其添加到新的dict中。但是,在外部for循环的第二次迭代中,您可以将第二项与第一项进行比较,并将第二项添加到新的dict中,从而生成相同长度的新dict。另外,第二个if应该是一个elif,因为如果一个项目的x和y值都在其他dict条目的范围内,您可能不想添加两次。好的,听起来正确:D。那么我该如何解决我的问题?只需将第二个if语句更改为and elif?感谢您在合并距离方面提出的建议。我想这就是我的代码的问题。即使尝试将新dict初始化为空dict,我也会得到相同的结果。但是如果x坐标或y坐标在范围内,我想组合我的对象。我认为你的解决方案只会在两个坐标都在范围内的情况下组合对象。哦,我明白了,所以让你的距离计算与以前一样,但你不应该像在第一个循环中那样复制值,而是在第二个双循环中组合值时添加它们