मैं किसी अन्य शब्दकोश के मुख्य मान के साथ तुलना करने के लिए नेस्टेड शब्दकोश मान तक पहुंचने का प्रयास कर रहा हूं। मेरे पास शब्दकोशों की दो सूची है। निम्नलिखित की तरह दिखें:

params = [{'nUID': '39', 'Query': [{'MaxRecords': '40', 'OrderName': 'Forecast Placeholder - 1005', 'CustomerID': '15283'}]}]

response = [{
    'OrderID': 1028,
    'Name': 'Forecast Placeholder - 1005',
    'CustomerID': 1127}]

मुझे पैराम्स से OrderName मान और प्रतिक्रिया से Name की तुलना करने की आवश्यकता है। मैंने जो कोशिश की है वह यहां है:

adpoint_key = "AdPoint_Id__c"
for index, my_dict in enumerate(test_data):
    if my_dict['DBU_Key__c'] != "AUT" and my_dict["AdPoint_Sync_Conditions__c"] != '"' and adpoint_key in my_dict.keys():
        my_dict["OpportunityID"] = my_dict["AdPoint_Id__c"]
        my_dict["CustomerID"] = my_dict["AdPoint_Customer_Id__c"]

        params = []
        params_dict = {}
        params_dict["nUID"] = "39"
        params_dict["Query"] = []
        new_dict = {} 
        new_dict["MaxRecords"] = "40"
        new_dict["OrderName"] = "Forecast Placeholder - " + my_dict["OpportunityID"]
        new_dict["CustomerID"] = my_dict["CustomerID"]
        params_dict["Query"].append(new_dict)
        params.append(params_dict)
#         print(params)

        response = client.service.GetOrders(**params[0]))

        results = []
        for a, b in zip(params, response):
            if b[0]['Name'] == a['Query'][0]['OrderName']:
                results.append(response_dict)
                print(results)

त्रुटि: TypeError: string indices must be integers

1
Chique_Code 15 अप्रैल 2020, 23:08
इसे आजमाएं response_dict["Name"] == params["Query"]["OrderName"]
 – 
Olvin Roght
15 अप्रैल 2020, 23:11
लेखन त्रुटि: सूची सूचकांकों को पूर्णांक या स्लाइस होना चाहिए, न कि str
 – 
Chique_Code
15 अप्रैल 2020, 23:12
1
अभी भी गलत है, क्योंकि params एक सूची है...
 – 
Błotosmętek
15 अप्रैल 2020, 23:12
@Chique_Code, जैसा कि अपेक्षित था, अब आपको इसे ठीक करना चाहिए और यह ठीक से काम करना शुरू कर देगा।
 – 
Olvin Roght
15 अप्रैल 2020, 23:13
मैंने निम्नलिखित कोशिश की है: response_dict["Name"] == params["Query"]["OrderName"] और TypeError: list indices must be integers or slices, not str मिला
 – 
Chique_Code
15 अप्रैल 2020, 23:15

5 जवाब

कोड में दो गलतियाँ हैं:

  1. params एक सूची भी है इसलिए इसे अनुक्रमित या क्रमांकित भी किया जाना चाहिए।

  2. param["query"] का परिणाम भी एक सूची है। आपको यह निर्दिष्ट करना होगा कि आप सूची में से किन शब्दकोशों तक पहुंच बनाना चाहते हैं (हालांकि इस मामले में केवल एक ही मौजूद है)

निम्नलिखित कोड काम करता है लेकिन मुझे नहीं पता कि यह आपका इच्छित व्यवहार है या नहीं:

for index, (response_dict, params_dict) in enumerate(zip(response, params)):
    if response_dict["Name"] == params_dict["Query"][0]["OrderName"]:
        results.append(response_dict)
        print(results)
0
Paul 15 अप्रैल 2020, 23:24
आपके उत्तर के लिए धन्यवाद, @Paul मेरे पास निम्न त्रुटि है: TypeError: zip तर्क # 1 को पुनरावृत्ति का समर्थन करना चाहिए, लेकिन इसने मुझे जिस परिणाम पर संदेह किया, उसे वापस कर दिया और मेरे पास परिणामों के लिए सही शब्दकोश जोड़ा जा रहा है, हालांकि जब मैं बाहर परिणाम प्रिंट करता हूं लूप टू लेकिन जब मैं भागा print(results) तो यह मुझे एक खाली सूची देता है
 – 
Chique_Code
15 अप्रैल 2020, 23:50

पैरामीटर ऑब्जेक्ट में कुंजी 'OrderName' से संबंधित मान तक पहुंचने के लिए आपको यह करना होगा:

ordername_value = params[0]['Query'][0]['OrderName']

प्रतिक्रिया ऑब्जेक्ट में कुंजी 'Name' से संबंधित मान तक पहुंचने के लिए आपको यह करना होगा:

name_value = response[0]['Name']

फिर आप ordername_value == name_value कर सकते हैं, जो True लौटाएगा यदि दो मान समान हैं और False यदि वे नहीं हैं।

0
sarartur 15 अप्रैल 2020, 23:46
मुझे TypeError: 'NoneType' object is not subscriptable ---> name_value = response[0]['Name'] पर मिला है
 – 
Chique_Code
16 अप्रैल 2020, 00:05
सुनिश्चित करें कि आपने params और response को अपने प्रश्न के बराबर सेट किया है। मैंने अपने अंत में अपने कोड का परीक्षण किया और सब कुछ ठीक काम करता है।
 – 
sarartur
16 अप्रैल 2020, 00:14
मैंने सभी चरों की तीन बार जांच की लेकिन फिर भी TypeError: 'NoneType' object is not subscriptable प्राप्त करता हूं :( क्या आप अपना कोड साझा कर सकते हैं जो आपके लिए काम करता है?
 – 
Chique_Code
16 अप्रैल 2020, 00:40
`` पैराम्स = [{'nUID': '39', 'क्वेरी': [{'MaxRecords': '40', 'OrderName': 'पूर्वानुमान प्लेसहोल्डर - 1005', 'ग्राहक आईडी': '15283'}]} ] प्रतिक्रिया = [{'ऑर्डर आईडी': 1028, 'नाम': 'पूर्वानुमान प्लेसहोल्डर - 1005', 'ग्राहक आईडी': 1127}] ऑर्डरनाम_वैल्यू = पैराम्स [0] ['क्वेरी'] [0] ['ऑर्डरनाम'] name_value = प्रतिक्रिया [0] ['नाम'] प्रिंट (ordername_value == name_value) # रिटर्न सही ```
 – 
sarartur
16 अप्रैल 2020, 00:51

आपको अपने for लूप की पहली दो पंक्तियों को बदलना होगा:

for a, b in zip(params, response):
    if b[0]['Name'] == a['Query'][0]['OrderName']:

फिर, यह काम करेगा

0
Shivam Jha 15 अप्रैल 2020, 23:49
क्या आप कृपया अपना पूरा कोड यहां कमेंट बॉक्स में कॉपी पेस्ट कर सकते हैं
 – 
Shivam Jha
16 अप्रैल 2020, 00:09
``` प्रतिक्रिया = client.service.GetOrders(**params[0]) # प्रिंट (प्रतिक्रिया) परिणाम = [] a, b के लिए ज़िप (पैरा, प्रतिक्रिया) में: यदि b[0]['नाम'] = = ए ['क्वेरी'] [0] ['ऑर्डरनाम']: परिणाम। संलग्न करें (प्रतिक्रिया_डिक्ट) प्रिंट (परिणाम) ```
 – 
Chique_Code
16 अप्रैल 2020, 00:12
लेकिन टिप्पणियों में पोस्ट करने के लिए संपूर्ण लूप बहुत बड़ा है। मैं पूरे लूप के साथ प्रश्न को संपादित कर सकता हूं, अभी बहुत कुछ चल रहा है
 – 
Chique_Code
16 अप्रैल 2020, 00:14
बस अपना कोड for लूप से शुरू करके पोस्ट करें। ध्यान दें कि आपके द्वारा पूछे गए प्रश्न में, वेरिएबल response_dict लूप में प्रयोग किया जाता है और इसके साथ भी जोड़ा जाता है.. जो नहीं किया जाना चाहिए
 – 
Shivam Jha
16 अप्रैल 2020, 00:19

मुझे संदेह है कि समस्या यह है कि params की वास्तविक संरचना मेल नहीं खाती कि आप इसे कैसे एक्सेस कर रहे हैं।

ऐसा प्रतीत होता है कि params शब्दकोशों की एक सूची है। फिर पहले डिक्शनरी ऑब्जेक्ट में Query नाम की एक कुंजी होती है जिसका मूल्य भी शब्दकोशों की एक सूची है। उस सूची के पहले डिक्शनरी ऑब्जेक्ट में नाम का प्रतिनिधित्व करने वाले संबंधित मान के साथ Order Name नाम की एक कुंजी होती है।

इसलिए, आपके द्वारा दिखाए गए params में उदाहरण डेटा को देखते हुए, Order Name मान Forecast Placeholder - 1005 को पुनः प्राप्त करने के लिए आपको लिखना होगा:

params[0]["Query"][0]["Order Name"]

बाहरी सूची में सबसे पहले फिस्ट डिक्शनरी को पुनः प्राप्त करें।
फिर Query
. नामक कुंजी के लिए मान प्राप्त करें फिर उस मान द्वारा दर्शाई गई सूची में पहला शब्दकोश पुनर्प्राप्त करें
फिर Order Name नाम की कुंजी के लिए मान प्राप्त करें

यदि यह आपका इरादा नहीं है, तो आपको params की संरचना को समायोजित करने की आवश्यकता हो सकती है।

यह प्रश्न प्राप्त करने के लिए कि आप वर्तमान में काम करने का प्रयास कर रहे हैं, इसे इस तरह दिखने की जरूरत है:

params["Query"]["OrderName"]

और params को इस तरह दिखना चाहिए:

params = {'nUID': '39', 'Query': {'MaxRecords': '40', 'OrderName': 'Forecast Placeholder - 1005', 'CustomerID': '15283'}}

आपको जो त्रुटि मिल रही है वह इसलिए है क्योंकि आप बाहरी सूची तक पहुँचने के बजाय एक स्ट्रिंग और पूर्णांक के साथ एक सूची में अनुक्रमित करने का प्रयास कर रहे हैं, फिर कोष्ठक के साथ कि आपके पास कैसे हैं, आप किसी अन्य स्ट्रिंग के साथ एक स्ट्रिंग में अनुक्रमित करने का प्रयास कर रहे हैं।

अगर आपको और विवरण चाहिए तो मुझे टिप्पणियों में बताएं।

संपादित करें:

ऐसा लगता है कि यह वही करना चाहिए जो आप चाहते हैं:

results = []
for index, response_dict in enumerate(response):
    if response_dict["Name"] == params[0]["Query"][0]["OrderName"]:
        results.append(response_dict)
            print(results)

संपादित करें:

चूंकि आपको एक शून्य संदर्भ त्रुटि मिल रही है, डिबगिंग की "ग्रेवस्टोन" तकनीक का उपयोग करने का प्रयास करें ...

results = []
for index, response_dict in enumerate(response):
    print response_dict
    print response_dict["Name"]
    print params
    print params[0]
    print params[0]["Query"]
    print params[0]["Query"][0]
    print params[0]["Query"][0]["OrderName"]
    if response_dict["Name"] == params[0]["Query"][0]["OrderName"]:
        results.append(response_dict)
            print(results)

और देखें कि यह किस प्रिंट स्टेटमेंट पर मरता है। इसके अलावा एक और पूर्ण स्टैक ट्रेस बेहद मददगार होगा

0
18grady 16 अप्रैल 2020, 00:48
दुर्भाग्य से, मैं डेटा प्रकार को नहीं बदल सकता क्योंकि पैरा पैरामीटर हैं जो एसओएपी कॉल के लिए जरूरी हैं जो मैं कर रहा हूं और प्रतिक्रिया विक्रेता से उस एसओएपी कॉल की प्रतिक्रिया है। यह तब तक बदलने योग्य नहीं है जब तक कि मैं लूप के लिए प्रारूप को सही नहीं बदलता, लेकिन मुझे यकीन नहीं है कि कौन सा प्रारूप ...
 – 
Chique_Code
16 अप्रैल 2020, 00:09
ठीक है कि सही समझ में आता है। हमें अक्सर इस तरह से बंधक बना लिया जाता है। इसका सीधा सा मतलब है कि आपको एक पुनरावृत्ति के लिए थोड़ा सा प्रशंसक चाहिए। मुझे कुछ चीजों का परीक्षण करने दें और मैं अपना उत्तर संपादित करूंगा।
 – 
18grady
16 अप्रैल 2020, 00:14
यह मुझे TypeError: 'NoneType' object is not iterable देता है :(
 – 
Chique_Code
16 अप्रैल 2020, 00:32

यहाँ एक दृष्टिकोण है। सबसे पहले, मूल पोस्ट के अनुसार params और response बनाएं। ध्यान दें कि params में नेस्टेड dicts हैं, और response में फ्लैट dicts हैं।

# original data
params = [{'nUID': '39', 
           'Query': [{'MaxRecords': '40', 
                      'OrderName': 'Forecast Placeholder - 1005', 
                      'CustomerID': '15283'}]}]
response = [{
    'OrderID': 1028,
    'Name': 'Forecast Placeholder - 1005',
    'CustomerID': 1127}]

अब सूचियों (यानी, पैराम्स, प्रतिक्रिया) पर पुनरावृति करने के लिए ज़िप का उपयोग करें।

results = list()

for p, r in zip(params, response):
    # use .get() for dictionary look-ups, to to emphasize dict vs list access
    if p.get('Query')[0].get('OrderName') == r.get('Name'):
        results.append(r)
        
print(results)
[{'OrderID': 1028, 'Name': 'Forecast Placeholder - 1005', 'CustomerID': 1127}]

1
jsmart 1 सितंबर 2020, 21:37