0

重複の可能性:
辞書内のキーが重複している場合にエラーを発生させる方法

私は最近、数十万のキーを持つ巨大な辞書を生成していました (そのため、それらを見てバグに気付くことは不可能でした)。構文的には正しいのですが、どこかにバグがありました。それは「重複キー」に要約されます:

{'a':1, ..., 'a':2}

このコードは正常にコンパイルされ、aキーの値が2期待どおりである理由がわかりませんでした1。問題は今や明らかです。

問題は、将来それをどのように防ぐことができるかです。これはpythonでは不可能だと思います。使った

grep "'.*'[ ]*:" myfile.py | sort | uniq -c | grep -v 1

これは防弾ではありません。他のアイデアはありますか(Python内では、このgrepは私が試したことを説明するためのものです)?

編集: 重複したキーは必要ありません。これが発生したことを特定し、データを手動で編集する必要があります

4

4 に答える 4

0

dictにダブルキーを含めることはできません。したがって、あなたがする必要があるのは、コードを実行してrepr()から、dictのをダンプすることです。

もう1つのオプションは、dictアイテムを(key, value)タプルとして作成することです。それらをリストに保存することで、それらからdictを簡単に作成しlen()、dict/listのsが異なるかどうかを確認できます。

于 2012-10-10T09:40:03.120 に答える
0

巨大な辞書を含む Python ファイルを生成していますか? 何かのようなもの:

print "{"
for lines in file:
    key, _, value = lines.partition(" ")
    print "    '%s': '%s',"
print "}"

その場合、ビルトインの構築を簡単にオーバーライドできないため、これを防ぐためにできることはあまりありませんdict

代わりに、辞書文字列の作成中にデータを検証することをお勧めします。別の構文を生成することもできます。

dict(a = '1', a = '2')

SyntaxError..キーが重複している場合に生成されます。ただし、辞書キーはキーワード引数よりもはるかに柔軟であるため、これらは完全に同等ではありません (たとえば、{123: '...'} is valid, butdict(123 = '...')` はエラーです)。

次のような関数呼び出しを生成できます。

uniq_dict([('a', '...'), ('a', '...')])

次に、関数定義を含めます。

def uniq_dict(values):
    thedict = {}

    for k, v in values:
        if k in thedict:
            raise ValueError("Duplicate key %s" % k)
        thedict[k] = v

     return thedict
于 2012-10-10T11:26:32.393 に答える
0

キーごとに複数の値が必要な場合は、defaultdict を使用して値をリストに格納できます。

>>> from collections import defaultdict
>>> data_dict = defaultdict(list)
>>> data_dict['key'].append('value')
>>> data_dict
defaultdict(<type 'list'>, {'key': ['value']})
>>> data_dict['key'].append('second_value')
>>> data_dict
defaultdict(<type 'list'>, {'key': ['value', 'second_value']})
于 2012-10-10T10:09:32.403 に答える
0

重複キーが表示されている場所にある辞書表示をどのように生成しているかを正確に言ったり示したりすることはありません。しかし、そこに問題があります。

{'a':1, ..., 'a':2}辞書を作成するようなものを使用する代わりに、次の形式を使用することをお勧めします。これは、指定されたペアdict([['a', 1], ..., ['a', 2]])のリストから作成します。このアプローチにより、辞書の実際の構築を行う[key, value]ためにペアを渡す前に、重複のペアのリストをチェックできます。dict()

重複のペアのリストをチェックする 1 つの方法の例を次に示します。

sample = [['a', 1], ['b', 2], ['c', 3], ['a', 2]]

def validate(pairs):
    # check for duplicate key names and raise an exception if any are found
    dups = []
    seen = set()
    for key_name,val in pairs:
        if key_name in seen:
            dups.append(key_name)
        else:
            seen.add(key_name)
    if dups:
        raise ValueError('Duplicate key names encountered: %r' % sorted(dups))
    else:
        return pairs

my_dict = dict(validate(sample))
于 2012-10-10T15:54:14.787 に答える