Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/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表中的keyerror_Python - Fatal编程技术网

python表中的keyerror

python表中的keyerror,python,Python,我对下面的代码感到困惑: class Table(object): def __init__(self): self.d = collections.defaultdict(dict) def add(self, row, col, val): self.d[row][col] = val def get(self, row, col, default=None): return self.d[row].get(col, d

我对下面的代码感到困惑:

class Table(object):
    def __init__(self):
        self.d = collections.defaultdict(dict)
    def add(self, row, col, val):
        self.d[row][col] = val
    def get(self, row, col, default=None):
        return self.d[row].get(col, default)
    def incol(self, col, val):
        for x,y in self.d.iteritems():
            if y[col]==val:
                wholerow=y
        return wholerow.values()
创建表之后,我无法使用“incol”函数获取所有值。它总是给我钥匙错误。然而,当我只使用相同的代码而不使用函数时,我可以得到我想要的。我的代码发生了什么…

上面的代码并不是“总是给我关键错误”(“总是”是我在这里争论的词)。例如,考虑下面的代码:

foo = Table()
foo.add("row_1", "col_1", "col_1_value")
foo.add("row_1", "col_2", "col_2_value")
print foo.get("row_1", "col_1")
print foo.incol("col_1", "col_1_value")
这项工作没有任何错误,并产生以下输出:

col_1_value
['col_2_value', 'col_1_value']
但是,如果您试图将不存在的列的名称传递到
incol
,您将得到一个
KeyError
。例如,如果将以下行附加到上述代码中:

print foo.incol("i do not exist", "my imaginary value")
您将得到一条类似以下内容的错误消息:

Traceback (most recent call last):
File "./stack_overflow-2013-03-14.py", line 21, in <module>
    print foo.incol("i do not exist", "my imaginary value")
File "./stack_overflow-2013-03-14.py", line 12, in incol
    if y[col]==val:
KeyError: 'i do not exist'
现在,如果运行以下行:

foo = Table()
foo.add("row_1", "col_1", "col_1_value")
foo.add("row_1", "col_2", "col_2_value")
print foo.get("row_1", "col_1")
print foo.incol("col_1", "col_1_value")
print foo.incol("i do not exist", "my imaginary value")
print foo.incol("i do not exist", None)
你会得到:

col_1_value
['col_2_value', 'col_1_value']
None
None
您还可以按照Martijn Pieters的建议使用以下incol实现方式:

def incol(self, col, val):
    result = None
    for x,y in self.d.iteritems():
        if y.get(col)==val:
            result = y.values()
            break
    return result
但是在这种情况下,如果您传递一个不存在的
名称和
val
=
,那么它将匹配任何行。相应的输出将是:

col_1_value
['col_2_value', 'col_1_value']
None
['col_2_value', 'col_1_value']

也许这就是您希望应用程序的行为。那由你决定

请发布完整错误。您如何调用该方法?“当我只使用相同的代码而不使用函数”是什么意思?在我看来,你似乎认为
y[col]
将存在,但
y
是一个常规词典。请尝试
y.get(col)=val
col_1_value
['col_2_value', 'col_1_value']
None
['col_2_value', 'col_1_value']