0

私は以下のコードについて混乱しています:

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」関数を使用してすべての値を取得することはできません。それはいつも私に重要なエラーを与えます。しかし、関数を使わずに同じコードを使うだけで、欲しいものを手に入れることができます。私のコードはどうなりましたか...

4

1 に答える 1

0

上記のコードは、「常にキー エラーが発生する」わけではありません (「常に」とは、ここで論争している言葉です)。たとえば、次のコードを考えてみましょう。

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'

incolこのような状況を処理できるの実装例は次のとおりです。

def incol(self, col, val):
    result = None
    for x,y in self.d.iteritems():
        if col in y and y[col]==val:
            result = y.values()
            break
    return result

ここで、次の行を実行すると:

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

incolMartijn Pieters が提案する次の実装を使用することもできます。

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

ただし、この場合、存在しないcol名前とval=を渡すとNone、どの行にも一致します。対応する出力は次のようになります。

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

おそらく、これはアプリケーションに必要な動作です。それはあなたが決めることです。

于 2013-03-14T22:44:27.580 に答える