545 Stimmen

Gibt es eine pythonische Möglichkeit, zwei Dicts (Hinzufügen von Werten für Schlüssel, die in beiden erscheinen) zu kombinieren?

Ich habe zum Beispiel zwei Dicts:

Dict A: {'a': 1, 'b': 2, 'c': 3}
Dict B: {'b': 3, 'c': 4, 'd': 5}

Ich brauche einen pythonischen Weg der "Kombination" zwei Dicts, so dass das Ergebnis ist:

{'a': 1, 'b': 5, 'c': 7, 'd': 5}

Das heißt: Wenn ein Schlüssel in beiden Dicts vorkommt, addiere ihre Werte, wenn er nur in einem Dict vorkommt, behalte seinen Wert.

16voto

myDict = {}
for k in itertools.chain(A.keys(), B.keys()):
    myDict[k] = A.get(k, 0)+B.get(k, 0)

13voto

Devesh Saini Punkte 507

Derjenige mit keine zusätzlichen Importe!

Ihr ist ein pythonischer Standard genannt. EAFP (Es ist leichter, um Verzeihung zu bitten als um Erlaubnis). Der nachstehende Code basiert darauf python standard .

# The A and B dictionaries
A = {'a': 1, 'b': 2, 'c': 3}
B = {'b': 3, 'c': 4, 'd': 5}

# The final dictionary. Will contain the final outputs.
newdict = {}

# Make sure every key of A and B get into the final dictionary 'newdict'.
newdict.update(A)
newdict.update(B)

# Iterate through each key of A.
for i in A.keys():

    # If same key exist on B, its values from A and B will add together and
    # get included in the final dictionary 'newdict'.
    try:
        addition = A[i] + B[i]
        newdict[i] = addition

    # If current key does not exist in dictionary B, it will give a KeyError,
    # catch it and continue looping.
    except KeyError:
        continue

EDIT: Dank an jerzyk für seine Verbesserungsvorschläge.

12voto

Adeel Punkte 751
import itertools
import collections

dictA = {'a':1, 'b':2, 'c':3}
dictB = {'b':3, 'c':4, 'd':5}

new_dict = collections.defaultdict(int)
# use dict.items() instead of dict.iteritems() for Python3
for k, v in itertools.chain(dictA.iteritems(), dictB.iteritems()):
    new_dict[k] += v

print dict(new_dict)

# OUTPUT
{'a': 1, 'c': 7, 'b': 5, 'd': 5}

OR

Alternativ können Sie Counter verwenden, wie @Martijn oben erwähnt hat.

8voto

schettino72 Punkte 2736

Für eine allgemeinere und erweiterbare Methode siehe fusioniert . Es verwendet singledispatch und kann Werte auf der Grundlage ihrer Typen zusammenführen.

Exemple :

from mergedict import MergeDict

class SumDict(MergeDict):
    @MergeDict.dispatch(int)
    def merge_int(this, other):
        return this + other

d2 = SumDict({'a': 1, 'b': 'one'})
d2.merge({'a':2, 'b': 'two'})

assert d2 == {'a': 3, 'b': 'two'}

7voto

PythonProgrammi Punkte 20089

Ab Python 3.5: Zusammenführen und Summieren

Danke an @tokeinizer_fsj, der mich in einem Kommentar darauf hingewiesen hat, dass ich den Sinn der Frage nicht ganz verstanden habe (ich dachte, add bedeute nur das Hinzufügen von Schlüsseln, die eventuell in den beiden Diktaten unterschiedlich sind, stattdessen meinte ich, dass die gemeinsamen Schlüsselwerte summiert werden sollten). Also habe ich diese Schleife vor der Zusammenführung hinzugefügt, so dass das zweite Wörterbuch die Summe der gemeinsamen Schlüssel enthält. Das letzte Wörterbuch wird dasjenige sein, dessen Werte im neuen Wörterbuch, das das Ergebnis der Zusammenführung der beiden ist, bestehen bleiben, so dass ich denke, dass das Problem gelöst ist. Die Lösung ist ab Python 3.5 und folgenden Versionen gültig.

a = {
    "a": 1,
    "b": 2,
    "c": 3
}

b = {
    "a": 2,
    "b": 3,
    "d": 5
}

# Python 3.5

for key in b:
    if key in a:
        b[key] = b[key] + a[key]

c = {**a, **b}
print(c)

>>> c
{'a': 3, 'b': 5, 'c': 3, 'd': 5}

Wiederverwendbarer Code

a = {'a': 1, 'b': 2, 'c': 3}
b = {'b': 3, 'c': 4, 'd': 5}

def mergsum(a, b):
    for k in b:
        if k in a:
            b[k] = b[k] + a[k]
    c = {**a, **b}
    return c

print(mergsum(a, b))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X