3

同じキーを含む 2 つの辞書がありますが、値のペアが異なります。dictA と dictB が問題の 2 つの辞書を表すようにしましょう。

dictA = {'key1':'Joe', 'key2':'Bob'}
dictB = {'key1':'Smith', 'key2':'Johnson'}

現在、ネストされた if ステートメントを使用して、一般的に発生するキーに基づいて新しい辞書を作成しています。そうすることで、キーを共有する値が、新しいディクショナリのリスト内に含まれます。以下でこれを確認してください。

dictAB = {}  # Create a new dictionary

# Create a list container for dictionary values
for key in dictA.keys():
    dictAB[key] = []

# Iterate through keys in both dictionaries
# Find matching keys and append the respective values to the list container
for key, value in dictA.iteritems():
    for key2, value2 in dictB.iteritems():
        if key == key2:
            dictAB[key].append(value)
            dictAB[key].append(value2)
        else:
            pass

Python辞書内包表記を使用して、これをよりクリーンな構造にするにはどうすればよいですか?

4

2 に答える 2

8

セットまたはキー ビューを使用する (python 2.7) :

dictAB = {k: [dictA[k], dictB[k]] for k in dictA.viewkeys() & dictB.viewkeys()}

2.7 より前:

dictAB = dict((k, [dictA[k], dictB[k]]) for k in set(dictA) & set(dictB))

Python 3 では、.keysビューとして実装されているため、このような操作にメソッドを直接使用できます。

dictAB = {k: [dictA[k], dictB[k]] for k in dictA.keys() & dictB.keys()}

デモ (python 2.7):

>>> dictA = {'key1':'Joe', 'key2':'Bob'}
>>> dictB = {'key1':'Smith', 'key2':'Johnson'}
>>> dictAB = {k: [dictA[k], dictB[k]] for k in dictA.viewkeys() & dictB.viewkeys()}
>>> print dictAB
{'key2': ['Bob', 'Johnson'], 'key1': ['Joe', 'Smith']}

&2 つのセットまたは辞書ビューの演算子は、両方のセットの交差を作成します。両方のセットに存在するすべてのキー。

キーの交差を使用することで、このコードは、dictA または dictB のいずれかが他の辞書に表示されないキーを持っている場合でも機能します。キーが常に一致することが絶対に確実な場合は、交点なしで直接いずれかの辞書を反復処理できます。

dictAB = {k: [dictA[k], dictB[k]] for k in dictA}
于 2012-07-03T14:55:51.377 に答える
0
dictAB = { key: [dictA[key],dictB[key]] for key in dictA if key in dictB }
于 2012-07-03T15:18:33.593 に答える