2015-08-03 6 views
5

इस तरह के एक नौसिखिया प्रश्न के लिए अग्रिम में माफ़ी। मैं सिर्फ अजगर लिखना शुरू कर रहा हूं और मुझे नेस्टेड डिक्शनरी/सूचियों से मूल्यों को पॉप करने के बारे में कुछ भ्रम हो रहा है, इसलिए मैं किसी भी मदद की सराहना करता हूं!पायथन नेस्टेड सूचियां/शब्दकोश और पॉपिंग मान

{ "scans": [ 
    { "status": "completed", "starttime": "20150803T000000", "id":533}, 
    { "status": "completed", "starttime": "20150803T000000", "id":539} 
] } 

मैं "स्कैन" कुंजी से बाहर 'आईडी' पॉप करना चाहते हैं:

मैं इस नमूने json डेटा है।

def listscans(): 
    response = requests.get(scansurl + "scans", headers=headers, verify=False) 
    json_data = json.loads(response.text) 
    print json.dumps(json_data['scans']['id'], indent=2) 

काम नहीं कर रहा है क्योंकि नेस्टेड कुंजी/मान सूची के अंदर हैं। यानी

>>> print json.dumps(json_data['scans']['id']) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: list indices must be integers, not str 

क्या कोई मुझे काम करने के लिए सही दिशा में इंगित कर सकता है? इसके साथ मेरा लंबा लक्ष्य एक फॉर-लूप बनाना है जो सभी आईडी को किसी अन्य शब्दकोश या सूची में रखता है जिसे मैं किसी अन्य फ़ंक्शन के लिए उपयोग कर सकता हूं।

+0

आपकी आखिरी टिप्पणी से ऐसा लगता है कि आपके पास पहले से ही एक अच्छा विचार है कि क्या करने की आवश्यकता है। इसे कोड करने का प्रयास क्यों न करें और हमें अपना प्रयास न दिखाएं? – goncalopp

+0

ने सोचा कि मैं इस धागे को एक लाख असफल उदाहरणों के साथ विस्फोट नहीं करूंगा जो मैंने भविष्य के पाठकों के लिए चीजों को संक्षिप्त रखने की कोशिश की है, जिनके समान समस्या है। – dobbs

उत्तर

2

json_data['scans'] रिटर्न dicts की एक सूची, तुम सूचकांक करने के लिए एक str यानी []["id"] जो स्पष्ट कारणों के लिए विफल रहता है तो आप इंडेक्स का उपयोग करने के लिए प्रत्येक subelement प्राप्त करने की आवश्यकता का उपयोग कर सूची की कोशिश कर रहे:

print json_data['scans'][0]['id'] # -> first dict 
print json_data['scans'][1]['id'] # -> second dict 

या देखने के लिए dicts की सूची पर सभी आईडी के पुनरावृति json_data["scans"] का उपयोग कर वापस लौटे:

for dct in json_data["scans"]: 
    print(dct["id"]) 

एक सूची से अटैचमेंट सहेजने के लिए:

all_ids = [] 
for dct in json_data["scans"]: 
    all_ids.append(dct["id"]) 

या एक सूची कंप्यूटर अनुप्रयोग का उपयोग करें:

all_ids = [dct["id"] for dct in json_data["scans"]] 

तो इस बात की संभावना कुंजी id हर dict में नहीं हो सकता है, in का उपयोग जांच करने के लिए इससे पहले कि आप का उपयोग है:

all_ids = [dct["id"] for dct in json_data["scans"] if "id" in dct] 
+0

सही! मैं [स्कैन '] के बाद सूची अनुक्रमण स्थिति खो रहा था। अब समझ में आता है। हालांकि मैं दूसरे उदाहरण पर उलझन में हूं। : प्रिंट (डी ["आईडी"]) सूचकांक स्थिति है? मैंने सोचा था कि आपको पॉप मानों – dobbs

+0

@ डब्स पर ब्रैकेट के अंदर इंडेक्स की स्थिति डालना पड़ा था, हम लूप में सूची में पुनरावृत्त कर रहे हैं ताकि प्रत्येक 'डी' सूची से प्रत्येक वास्तविक 'तत्व/dict' है ताकि हम द्वारा निर्देश प्राप्त किया जा सके। प्रत्येक मान प्राप्त करने के लिए कुंजी 'आईडी' –

0

यहाँ कैसे कर सकते हैं आप वस्तुओं पर पुन: प्रयास करते हैं और सभी आईडी निकालें:

json_data = ... 
ids = [] 
for scan in json_data['scans']: 
    id = scan.pop('id') 
    # you can use get instead of pop 
    # then your initial data would not be changed, 
    # but you'll still have the ids 
    # id = scan.get('id') 
    ids.append(); 

यह दृष्टिकोण यह भी काम करेगा:

ids = [item.pop('id') for item in json_data['scans']] 
संबंधित मुद्दे