Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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 dict_Python - Fatal编程技术网

具有重复键或无键的Python dict

具有重复键或无键的Python dict,python,Python,我在python中有一个类,其中我有一个包含邻居的dict,一个包含21个类实例的列表pri_list,但是如果我迭代该邻居,我会得到重复的键或None print type(self.neighbors) print str(self.id) + " " + str(self.neighbors) print "" for n in self.neighbors: print str(pri_list[n].id) + " " + str(pri_list[n].neighbors)

我在python中有一个类,其中我有一个包含邻居的dict,一个包含21个类实例的列表
pri_list
,但是如果我迭代该邻居,我会得到重复的键或
None

print type(self.neighbors)
print str(self.id) + " " + str(self.neighbors)
print ""
for n in self.neighbors:
    print str(pri_list[n].id) + " " + str(pri_list[n].neighbors)
    pri_list[n].neighbors.update({self.id:self.neighbors[n]})
    print str(pri_list[n].id) + " " + str(pri_list[n].neighbors)
导致

<type 'dict'>
21 {22: 34.348765355132869, 23: 0, 19: 0.049076419727497315, 20: 36.087031068160286}

22 {21: 34.348765355132869, 23: 34.602568871995345, 8: 0.2351466696454737, 17: 0, 20: 0}
22 {21: 34.348765355132869, 23: 34.602568871995345, 8: 0.2351466696454737, 17: 0, 20: 0}
23 {21: 0, 22: 34.602568871995345, 8: 26.643673903936367, 17: 36.80385613689073}
23 {21: 0, 21: 0, 22: 34.602568871995345, 8: 26.643673903936367, 17: 36.80385613689073}
19 {21: 0.049076419727497315, 14: 0, 18: 41.407044987390677, 20: 39.517515427920443}
19 {21: 0.049076419727497315, 14: 0, 18: 41.407044987390677, 20: 39.517515427920443}
20 {21: 36.087031068160286, 22: 0, 18: 0.58414114578772669, 19: 39.517515427920443}
20 {21: 36.087031068160286, 22: 0, 18: 0.58414114578772669, 19: 39.517515427920443}
给出相同的结果

我在两台不同的机器上试过,结果都一样

我做了一个测试示例,其中我将dict中的数据复制到as上

class A:
    neighbors = {}
    id = 0

    def __init__(self,id, neighbors):
        self.id = id
        self.neighbors = neighbors.copy()

if __name__ == "__main__":
    pri_list = [A(i, {})for i in range(0, 19)]

    pri_list.append(A(19, {21: 0.049076419727497315, 14: 0, 18: 41.407044987390677, 20: 39.517515427920443}))
    pri_list.append(A(20, {21: 36.087031068160286, 22: 0, 18: 0.58414114578772669, 19: 39.517515427920443}))
    pri_list.append(A(21, {22: 34.348765355132869, 23: 0, 19: 0.049076419727497315, 20: 36.087031068160286}))
    pri_list.append(A(22, {21: 34.348765355132869, 23: 34.602568871995345, 8: 0.2351466696454737, 17: 0, 20: 0}))
    pri_list.append(A(23, {21: 0, 22: 34.602568871995345, 8: 26.643673903936367, 17: 36.80385613689073}))

    print type(pri_list[21].neighbors)
    print str(pri_list[21].id) + " " + str(pri_list[21].neighbors)
    print ""

    for n in pri_list[21].neighbors:
        print str(pri_list[n].id) + " " + str(pri_list[n].neighbors)
        pri_list[n].neighbors.update({pri_list[21].id:pri_list[21].neighbors[n]})
        print str(pri_list[n].id) + " " + str(pri_list[n].neighbors)
这产生了预期的结果

<type 'dict'>
21 {22: 34.348765355132869, 23: 0, 19: 0.049076419727497315, 20:     36.087031068160286}

22 {8: 0.2351466696454737, 17: 0, 20: 0, 21: 34.348765355132869, 23: 34.602568871995345}
22 {8: 0.2351466696454737, 17: 0, 20: 0, 21: 34.348765355132869, 23: 34.602568871995345}
23 {21: 0, 22: 34.602568871995345, 8: 26.643673903936367, 17: 36.80385613689073}
23 {21: 0, 22: 34.602568871995345, 8: 26.643673903936367, 17: 36.80385613689073}
19 {21: 0.049076419727497315, 14: 0, 18: 41.407044987390677, 20: 39.517515427920443}
19 {21: 0.049076419727497315, 14: 0, 18: 41.407044987390677, 20: 39.517515427920443}
20 {21: 36.087031068160286, 22: 0, 18: 0.58414114578772669, 19: 39.517515427920443}
20 {21: 36.087031068160286, 22: 0, 18: 0.58414114578772669, 19: 39.517515427920443}

21 {22: 34.348765355132869, 23: 0, 19: 0.049076419727497315, 20:     36.087031068160286}
22 {8: 0.2351466696454737, 17: 0, 20: 0, 21: 34.348765355132869, 23: 34.602568871995345}
22 {8: 0.2351466696454737, 17: 0, 20: 0, 21: 34.348765355132869, 23: 34.602568871995345}
23 {21: 0, 22: 34.602568871995345, 8: 26.643673903936367, 17: 36.80385613689073}
23 {21: 0, 22: 34.602568871995345, 8: 26.643673903936367, 17: 36.80385613689073}
19 {21: 0.049076419727497315, 14: 0, 18: 41.407044987390677, 20: 39.517515427920443}
19 {21: 0.049076419727497315, 14: 0, 18: 41.407044987390677, 20: 39.517515427920443}
20 {21: 36.087031068160286, 22: 0, 18: 0.58414114578772669, 19: 39.517515427920443}
20 {21: 36.087031068160286, 22: 0, 18: 0.58414114578772669, 19: 39.517515427920443}
在执行更新后,观察键21如何在
id=23
dict中仅出现一次,并且dict的排列也不同


我甚至很难理解在同一个dict中如何出现多个键,根据这一点,这应该是不可能的

您提供的代码的问题是,您在迭代时更新了词典。我不是100%确定这是原因,但一般来说,这是一个坏主意,它确实会导致不可预测的结果。只需复制一份以进行迭代。

循环后,您能否再次打印
打印自己的邻居?我的猜测是没有添加任何内容。旁白:如果
len(poly_line)<0
做过任何事情,那将是非常令人惊讶的。我猜
相邻的
pri_list[23]
的dict中有一个看起来像整数但实际上不是一的键。具体地说,它的
repr
“21”
,但它的
散列
不是
散列(21)
。你能试着在pri_列表[23]中运行键的
。邻居:打印(键,键入(键))
21
键之一不是整数吗?您是如何在原始代码中生成这些键的?谢谢,这是一个非常好的主意,但不幸的是,输出都是int(21,)(21,)(22,)(8,)(17,)您的代码在迭代字典时会更新字典吗?然后,您是否看到一个键一次、两次或根本没有,这是未定义的,您需要以其他方式进行迭代。我能想到两个,但它们并不相等。
<type 'dict'>
21 {22: 34.348765355132869, 23: 0, 19: 0.049076419727497315, 20:     36.087031068160286}

22 {8: 0.2351466696454737, 17: 0, 20: 0, 21: 34.348765355132869, 23: 34.602568871995345}
22 {8: 0.2351466696454737, 17: 0, 20: 0, 21: 34.348765355132869, 23: 34.602568871995345}
23 {21: 0, 22: 34.602568871995345, 8: 26.643673903936367, 17: 36.80385613689073}
23 {21: 0, 22: 34.602568871995345, 8: 26.643673903936367, 17: 36.80385613689073}
19 {21: 0.049076419727497315, 14: 0, 18: 41.407044987390677, 20: 39.517515427920443}
19 {21: 0.049076419727497315, 14: 0, 18: 41.407044987390677, 20: 39.517515427920443}
20 {21: 36.087031068160286, 22: 0, 18: 0.58414114578772669, 19: 39.517515427920443}
20 {21: 36.087031068160286, 22: 0, 18: 0.58414114578772669, 19: 39.517515427920443}