मैं इस तरह की दो OrderedDict वस्तुएँ जोड़ना चाहूँगा:

dict1 = OrderedDict([('Table', [10, 20, 30, 'wood']), ('Chair', [200, 300, 400, 'wood'])])
dict2 = OrderedDict([('Table', ['red', 55]), ('Chair', ['blue', 200])])

और इस तरह एक नया OrderedDict बनाएं (आदेश महत्वपूर्ण है):

dict3 = OrderedDict([('Table', [10, 20, 30, 'wood', 'red', 55]), ('Chair', [200, 300, 400, 'wood', 'blue', 200])])

यदि dict1 या dict2 में कोई कुंजियाँ हैं जो दूसरे में मौजूद नहीं हैं, तो उन्हें अनदेखा कर दिया जाना चाहिए, आउटपुट के लिए केवल मिलान कुंजियों का उपयोग किया जाना चाहिए। सभी मान सूचियां हैं।

1
Victor Gambarini 10 नवम्बर 2016, 21:39
और आप आउटपुट के रूप में एक नया शब्दकोश रखना चाहते हैं, है ना? dict1 या dict2 में सूचियों को अपडेट नहीं करना।
 – 
Martijn Pieters
10 नवम्बर 2016, 21:41
दरअसल, किसी भी डिक्ट को अपडेट करना भी काम करेगा।
 – 
Victor Gambarini
10 नवम्बर 2016, 21:46
मैंने आपका प्रश्न साफ़ कर दिया है और एक और धारणा जोड़ दी है: कि सभी मान सूचियां हैं।
 – 
Martijn Pieters
10 नवम्बर 2016, 22:03
एक और बढ़त-मामला: यदि dict2 में आदेश dict1 के क्रम से भिन्न हो तो क्या होगा?
 – 
Martijn Pieters
10 नवम्बर 2016, 22:08

2 जवाब

क्योंकि आप अपनी OrderedDict वस्तुओं के क्रम को संरक्षित करना चाहते हैं, आपको एक पर लूप करना होगा और दो कुंजी सेटों के मिलन का उत्पादन करने के लिए प्रत्येक कुंजी को दूसरे के विरुद्ध परीक्षण करना होगा:

dict3 = OrderedDict((k, dict1[k] + dict2[k]) for k in dict1 if k in dict2)

dict1 पर लूप करना यह सुनिश्चित करता है कि हम नए शब्दकोश के लिए कुंजियों को उसी क्रम में आउटपुट करें, k in dict2 के साथ परीक्षण यह सुनिश्चित करता है कि हम केवल उन कुंजियों का उपयोग करें जो दोनों इनपुट मैपिंग में मौजूद हैं।

आप dict1 को list.extend() के साथ इन-प्लेस भी अपडेट कर सकते हैं:

for key, value in dict1.items():
    if key in dict2:
        value.extend(dict2[key])

डेमो:

>>> from collections import OrderedDict
>>> dict1 = OrderedDict([('Table', [10, 20, 30, 'wood']), ('Chair', [200, 300, 400, 'wood'])])
>>> dict2 = OrderedDict([('Table', ['red', 55]), ('Chair', ['blue', 200])])
>>> OrderedDict((k, dict1[k] + dict2[k]) for k in dict1 if k in dict2)
OrderedDict([('Table', [10, 20, 30, 'wood', 'red', 55]), ('Chair', [200, 300, 400, 'wood', 'blue', 200])])
5
Martijn Pieters 10 नवम्बर 2016, 22:03
ठीक उसी तरह काम किया जैसा मुझे चाहिए था! बहुत बहुत धन्यवाद मार्टिजन!
 – 
Victor Gambarini
11 नवम्बर 2016, 16:49
पीटर्स आप एन ऑर्डरेड डिक्ट (()?
 – 
azal
18 मार्च 2021, 12:41
@azal: कोई शॉर्टकट नहीं है, बस ऑपरेशन दोहराएं।
 – 
Martijn Pieters
21 मार्च 2021, 16:46
dict3 = {}
for i in dict1:
    if i in dict2:
        dict3[i]=[]
        for j in dict1[i]:
            dict3[i].append(j)
        for j in dict2[i]:
            dict3[i].append(j)
0
Varun Dey 10 नवम्बर 2016, 22:37
ध्यान दें कि चूंकि आप केवल एक ताना का उपयोग कर रहे हैं, ऑर्डरिंग की गारंटी नहीं है।
 – 
Peter Brittain
11 नवम्बर 2016, 01:34
चूंकि यह पहले dict1 के तत्वों पर और फिर dict2 पर पुनरावृत्ति कर रहा है, मुझे लगता है कि किसी विशेष कुंजी के सभी मान क्रम में होंगे। मुझे बताएं कि क्या मैं ऐसा सोचने में गलत हूं। :)
 – 
Varun Dey
11 नवम्बर 2016, 18:44
यह निर्भर करता है कि आप "आदेश रखने" की व्याख्या कैसे करते हैं। इस तथ्य से कि मूल कोड OrderedDicts का उपयोग कर रहा था, मुझे लगता है कि आवश्यकता चाबियों और मूल्यों के आदेश के लिए थी।
 – 
Peter Brittain
11 नवम्बर 2016, 19:36