Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较字典值并整理一些_Python_Dictionary_Comparison - Fatal编程技术网

Python 比较字典值并整理一些

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:

我有一个字典,其中包含一个随机生成的键(例如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:

    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坐标在范围内,我想组合我的对象。我认为你的解决方案只会在两个坐标都在范围内的情况下组合对象。哦,我明白了,所以让你的距离计算与以前一样,但你不应该像在第一个循环中那样复制值,而是在第二个双循环中组合值时添加它们