0

現在、辞書内包表記内でリスト内包表記を使用して、リストを値として持つ2つの辞書間の変更を検出しています。

コードは次のようになります。

detectedChanges = {table: [field for field in tableDict[table] if field not in fieldBlackList] for table in modifiedTableDict if table not in tableBlackList}

これにより、各エントリがテーブル名であり、それに関連付けられたリストの変更であるディクショナリが作成されます。

私が得ている問題は、このコードは機能しますが、結果の構造detectedChangesが、テーブル名と空のリストのみを含むエントリで満たされることです(変更が検出されなかったことを意味します)。

現在、これらのエントリを削除するために辞書を後方スイープしていますが、そもそもそれらを辞書に入れないようにしたいと思います。

基本的に、長さのチェックなどを行うことができれば[field for field in tableDict[table]、key:value エントリを作成する前にそれを検証できます。

現在使用している方法でこれを行う方法はありますか?

4

2 に答える 2

1

dict 内包表記はクールですが、誤用すべきではありません。次のコードはそれほど長くはなく、狭い画面でも表示できます。

detectedChanges = {}
for table, fields in modifiedTableDict.iteritems():
    if table not in tableBlackList:
        good_fields = [field for field in fields
                             if field not in fieldBlackList]
        if good_fields:
            detectedChanges[table] = good_fields
于 2015-02-04T16:23:10.557 に答える
0

eumiro's answerへの追加です。読みやすいので、最初に回答を使用してください。ただし、私が誤解していなければ、理解は一般的に高速であるため、ユースケースが1つありますが、これがあなたのコードのボトルネックである場合のみです。私はそれを十分に強調することはできません。

detectedChanges = {table: [field for field in tableDict[table]
                           if field not in fieldBlackList]
                   for table in modifiedTableDict
                   if table not in tableBlackList
                   if set(tableDict[table])-set(fieldBlackList)}

これがいかに醜いか注意してください。私は、Python をよりよく理解するためにこのようなことを楽しんでいます。これは、以前にもこのようなことがボトルネックになったことがあるためです。ただし、存在しない可能性がある問題を解決しようとする前に、常にプロファイリングを使用する必要があります。

コードへの追加[...] if set(tableDict[table])-set(fieldBlackList) [...]により、現在のテーブルにエントリのセットとブラックリストに登録されたフィールドのセットが作成され、現在のテーブルにあってブラックリストにないエントリが取得されます。空のセットはFalse、あたかもtableBlackList変数にあるかのように、内包表記がそのテーブルを無視するように評価します。より明確にするために、結果を空のセットと比較するか、値が含まれているかどうかを確認できます。

また、速度のために次のことをお勧めします。

detectedChanges = {table: [field for field in fields
                           if field not in fieldBlackList]
                   for table, fields in modifiedTableDict.iteritems()
                   if table not in tableBlackList
                   if set(fields)-set(fieldBlackList)}
于 2015-02-04T16:34:05.180 に答える