繁体   English   中英

在python结果中为字典分配值,并且键值错误

[英]Assigning values to dictionary in python results with value in the wrong key

我正在通过Euler项目编程,遇到了一个奇怪的问题。 我想找到所有可能的方法来从两个自然数生成一个(自然)数。 我创建了一个简单的循环,注意到了奇怪的结果。 例如,从3和1生成1。

#Importing stuff I often use in my solutions/tests
from math import sqrt, log, floor, pow, fabs, factorial
from sets import Set
from random import randint
from itertools import permutations
import sys


dub = dict()

c = 0 #Counting the number of elements in dub[18], use to track changes
for i in range (1,10):
    if 18 in dub: #setting c = len(dub[18])
        c = len(dub[18])
    for j in range (i+1,10):
        pair = [[i,j]]
        v = i+j
        if v in dub:
            dub[v].append(pair[0])
        else:
            dub[v] = pair
        v = i*j        
        if v in dub:
            dub[v].append(pair[0])
        else:
            if i == 3 and j == 8: print 'here', v # The value that is added to dub[18] instead of dub[24]
            dub[v] = pair
        if 18 in dub and not c == len(dub[18]): #This is how I found that something is wrong.
            c = len(dub[18])
            print dub[18]
            print v,i,j
            raw_input()

结果如下:

[[2, 9]]
18 2 9

[[2, 9], [3, 6]]
18 3 6

here 24
[[2, 9], [3, 6], [3, 8]]
24 3 8

我应该使用的密钥是24,但是列表位于密钥18下。为什么会这样?

您正在为多个键重用同一列表。 线

pair = [[i,j]]

创建一个包含一对的列表。 此列表用于else两个分支

else:
    dub[v] = pair

导致使用同一列表对象的两个不同键。 由于它是同一个对象,因此对于这两个键中的任何一个,追加到列表的内容在另一个中都是可见的。

编辑 :这是演示此行为的最小示例:

>>> d = {}
>>> a = []
>>> d[0] = a
>>> d[1] = a
>>> d[0].append(2)
>>> d[0]
[2]
>>> d[1]
[2]

明显的解决方法是仅将名称pair分配给名称pair ,并在需要时创建一个包含该名称pair的新列表:

dub = {}
for i in range (1, 10):
    for j in range (i + 1, 10):
        pair = [i, j]
        v = i + j
        if v in dub:
            dub[v].append(pair)
        else:
            dub[v] = [pair]
        v = i * j
        if v in dub:
            dub[v].append(pair)
        else:
            dub[v] = [pair]

为了进一步简化此代码,您可以将if替换为dict.setdefault()

dub = {}
for i in range (1, 10):
    for j in range (i + 1, 10):
        pair = [i, j]
        dub.setdefault(i + j, []).append(pair)
        dub.setdefault(i * j, []).append(pair)

如果使用fromkeys ,也会导致此问题。

数据= dict.fromkeys([int(x)for row in row [1:]],[])

解决方案是使用setdefault而不是fromkeys来初始化字典的默认值:

data.setdefault(idx,[])。append((row [0],val))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM