2017-12-15 93 views
5

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

संरचना होगा:

[{key1: [val1, val2]}, {key2: [val3, val4]}, {key3: [val5, val6]}, ...] 

मैं पूर्णांकों की एक सूची के साथ शुरू:

my_list = [3423, 77813, 12, 153, 1899] 

सूची में प्रत्येक तत्व के लिए, यह एक शब्दकोश कुंजी बन जाना चाहिए। मैं फिर दो वस्तुओं को शब्दकोश के मूल्य में जोड़ता हूं (जो एक सूची है)।

[{3423:['dog', 'cat']}, {77813:['dog', 'cat']}, {12:['dog', 'cat']}, 
    {153:['dog', 'cat']}, {1899:['dog', 'cat']}] 

यह करने के लिए मेरे प्रयास है कई समस्याओं:

for i in my_list: 
    d = {} ## create a dictionary 'd' 
    d[i] = [].append('dog') ## or `d[i] = ['dog'].append('cat')` 
    my_list.append(d) ## here is a bug 
    my_list.remove(i) ## remove the item from the list 

यहाँ अंतिम परिणाम दिखाई देते हैं यह चाहिए (मान लीजिए कि दो आइटम हमेशा "कुत्ता" और "cat" कर रहे हैं चलो)

  1. मुझे पसंद नहीं है मैं एक खाली शब्दकोश नाम के लिए है, और प्रत्येक एक ही बात नामित (यहाँ, d) उन्हें है। बाद में, मैं इन सभी शब्दकोशों को चाबियों से एक्सेस करना चाहता हूं --- मुझे उनके नामों की परवाह नहीं है।

  2. मुझे नहीं पता कि यह वास्तव में एक सूची होने पर शब्द मूल्य में एकाधिक वस्तुओं को कैसे जोड़ना है। अगर मैं कई वस्तुओं को जोड़ना चाहता हूं तो क्या होगा?

  3. बग मूल सूची में शब्दकोश को जोड़ रहा है और फिर आइटम को हटा रहा है। जाहिर है, इस नई सूची से हल किया जा सकता:

    new_list = [] 
    for i in my_list: 
        d = {} 
        d[i] = [].append('dog') 
        new_list.append(d) 
        my_list.remove(i) 
    

लेकिन यह बहुत ही अनाड़ी लगता है।

+1

क्या आपको अपने लक्ष्य तक पहुंचने के लिए इस संरचना का उपयोग करना है? आप जो हासिल करने की कोशिश कर रहे हैं उसके आधार पर एक ऑब्जेक्ट उन्मुख दृष्टिकोण कुछ जटिलता को कम कर सकता है। कम से कम आप 'संग्रह''-मॉड्यूल में' डिफ़ॉल्ट डिफॉल्ट'' पर एक नज़र डाल सकते हैं। फिर आप '' list_dict = defaultdict (list) '' कर सकते हैं, ताकि आप जान सकें कि dict में प्रत्येक प्रविष्टि पहले से ही एक खाली सूची है। –

उत्तर

6

तुम सच में सरल कुछ चाहते हैं, तो आप एक सूची समझ का उपयोग कर सकते हैं:

data = ['dog', 'cat'] 

my_list = [3423, 77813, 12, 153, 1899] 

result = [{k:data} for k in my_list] 

print(result) 
# [{3423: ['dog', 'cat']}, {77813: ['dog', 'cat']}, {12: ['dog', 'cat']}, {153: ['dog', 'cat']}, {1899: ['dog', 'cat']}] 

साथ ही, यहाँ बहुत convienient defaultdict साथ मूल्यों को हटाने जोड़ने/का एक उदाहरण है:

from collections import defaultdict 

my_list = [3423, 77813, 12, 153, 1899] 

new_list = [] 
for number in my_list: 

    # create the defaultdict here 
    d = defaultdict(list) 

    # add some data 
    d[number] += ['dog', 'cat', 'kitten'] 

    # remove some data 
    d[number].remove('kitten') 

    # append dictionary 
    new_list.append(dict(d)) 

print(new_list) 

कौन सा आउटपुट:

[{3423: ['dog', 'cat']}, {77813: ['dog', 'cat']}, {12: ['dog', 'cat']}, {153: ['dog', 'cat']}, {1899: ['dog', 'cat']}] 

एकका उपयोग करनायहां सहायक है, क्योंकि यह रिक्त सूची के साथ शब्दकोश में प्रत्येक प्रविष्टि को प्रारंभ करता है। यदि आप ऐसा नहीं करना चाहते हैं, तो आप इसे अपने सामान्य प्रश्न के साथ प्राप्त कर सकते हैं, जैसा कि आपके प्रश्न में दिखाया गया है, लेकिन इसके लिए आपको खाली सूचियां स्वयं शुरू करने की आवश्यकता है।

+0

'डी [संख्या] + = ['कुत्ता', 'बिल्ली', 'बिल्ली का बच्चा']' डी [संख्या] = ['कुत्ता', 'बिल्ली', 'बिल्ली का बच्चा'] के बजाय क्यों होगा? – EB2127

2

आप प्रसंस्करण बहुत सरल बनाने के लिए एक collections.defaultdict शब्दकोश उपवर्ग इस्तेमाल कर सकते हैं:

from collections import defaultdict 
from pprint import pprint 

my_list = [3423, 77813, 12, 153, 1899] 
d = defaultdict(list) 

for i in my_list: 
    d[i].append('dog') 
    d[i].append('cat') 

d = dict(d) # Convert d into a regular dictionary (optional). 
pprint(d) 

आउटपुट:

{12: ['dog', 'cat'], 
153: ['dog', 'cat'], 
1899: ['dog', 'cat'], 
3423: ['dog', 'cat'], 
77813: ['dog', 'cat']} 
बेशक

, अगर सब तुम क्या करने वाले प्रत्येक के लिए उन दो आइटम संलग्न है प्रविष्टि, यह एक ही ऑपरेशन में दोनों को करने के लिए थोड़ा अधिक कुशल होगा:

for i in my_list: 
    d[i].extend(['dog', 'cat']) 
2

यदि आप प्रत्येक कुंजी के लिए अलग-अलग मानों के साथ सूची समझ का उपयोग करना चाहते हैं।

keys = ['key1', 'key2', 'key3'] 
values = [['val11', 'val12'], ['val21', 'val22'], ['val31', 'val32']] 

# This is what you want (if I understood correctly) 
dlist = [{x:values[i]} for i,x in enumerate(keys)] 

print(dlist) 

# When you want to add more dictionary to the list 
dlist.append({'key4': ['val41', 'val42']}) 

print(dlist) 

आउटपुट:

[{'key1':['val11','val12']}, {'key2':['val21','val22']}, {'key3':['val31','val32']}] 
[{'key1':['val11','val12']}, {'key2':['val21','val22']}, {'key3':['val31','val32']}, {'key4':['val41', 'val42']}] 
2

आप को दूर करने, किसी भी बाहरी मॉड्यूल आयात करने के बिना या यह बहुत जटिल आप बस शुद्ध अजगर में इस पद्धति का अनुसरण कर सकते बनाने के बिना की जरूरत नहीं है:

data = ['dog', 'cat'] 

my_list = [3423, 77813, 12, 153, 1899] 

new_data={} 
for item in my_list: 
    for sub_item in data: 

     if item not in new_data: 
      new_data[item]=[sub_item] 
     else: 
      new_data[item].append(sub_item) 

print(new_data) 

आउटपुट:

{153: ['dog', 'cat'], 1899: ['dog', 'cat'], 12: ['dog', 'cat'], 77813: ['dog', 'cat'], 3423: ['dog', 'cat']} 
संबंधित मुद्दे