2017-10-03 11 views
2

Das Problem mit den gleichen Schlüssel von Werten von zwei Wörterbücher multipliziert, habe ich beschlossen, wie folgt:Multipliziert man die Werte der Wörterbücher mit verschiedenen Schlüsseln

v1={'name1': '10', 'name2': '20'} 
v2={'name1': '4', 'name2': '5'} 

foo = lambda dct_1, dct_2: {key: int(dct_2[key]) * int(dct_1[key]) for key in dct_2} 

foo(v1, v2) 
# Out: {'name1': 40, 'name2': 100} 

Wie kann ich Werte von zwei Wörterbücher in der gleichen Art und Weise vermehren, aber mit den verschiedenen Schlüsseln?

v1={'name1': '10', 'name2': '20'} 
v2={'quantity1': '4', 'quantity2': '5'} 

#OUT: {'name1':'40', 'name2': '100'} 
+1

enthält der Schlüsselname von jedem 'dict' die gleiche Nummer? – Dadep

+2

Seien Sie sehr vorsichtig. Dicts sind nicht geordnet, also woher weißt du, welche Elemente zusammen zu multiplizieren. Erwägen Sie, stattdessen Collections.OrderedDict zu verwenden. –

+0

Hallo! Ich habe mir ein Beispiel ausgedacht. In diesem Beispiel ja. Aber im Allgemeinen wollte ich in diesem Beispiel betonen, dass verschiedene Namen von Schlüsseln. Danke für deinen Kommentar – Yaroslav

Antwort

2

Angenommen, Sie haben immer entsprechende nameX und quantityX Werten Sie eine einfache ersetzen auf den Tasten verwenden:

foo = lambda dct_1, dct_2: {key: int(dct_2[key.replace('name', 'quantity')]) * int(dct_1[key]) for key in dct_1} 
1
multiplydicts = lambda x,y: { key: str(int(v1[key]) * int(val)) for key,val in zip(v1.keys(), v2.values())} 

Unter der Annahme, dass Ihre Wörterbücher haben die gleiche Größe dieses den Trick tun sollten , und v2.values ​​() gibt die Werte von v2 in der Reihenfolge der Konstruktion zurück.

1

können Sie tun:

>>> v1={'name1': '10', 'name2': '20'} 
>>> v2={'quantity1': '4', 'quantity2': '5'} 
>>> d={'name'+str(i+1) : int(v1['name'+str(i+1)])*int(v2['quantity'+str(i+1)]) for i in range(len(v1))} 
>>> d 
{'name2': 100, 'name1': 40} 
1

Sie brauchen nur etwas hinzufügen die Schlüssel im ersten Wörterbuch denen in der zweiten abzubilden. Der einfachste Weg dazu ist ein drittes Wörterbuch mit dem Namen keymap im folgenden Code. Die Schlüssel im ersten Wörterbuch bestimmen diejenigen, die in dem zurückgegebenen Wörterbuch erscheinen.

Dies ist erforderlich, da die Reihenfolge der Schlüssel in normalen Wörterbüchern undefiniert ist, so dass Sie sich nicht darauf verlassen können, in welcher Reihenfolge sie angezeigt werden, wenn Sie über sie iterieren.

v1={'name1': '10', 'name2': '20'} 
v2={'quantity1': '4', 'quantity2': '5'} 
keymap = {'name1': 'quantity1', 'name2': 'quantity2'} # Added. 

foo = (lambda dct_1, dct_2: 
     {key: int(dct_2[keymap[key]]) * int(dct_1[key]) for key in dct_1}) 

print(foo(v1, v2)) # -> {'name1': 40, 'name2': 100} 
Verwandte Themen