2015-03-19 4 views
5

मेरे पास पाइथन में होमवर्क समस्या है।
मैं लिनक्स पर पायथन संस्करण 3.4.0 का उपयोग कर रहा हूं।
डिजाइन दस्तावेज़ कहा गया है कि मैं एक CSV फ़ाइल को पढ़ने के लिए कर रहा हूँ, Names.dat के रूप में निर्दिष्ट कार्यों में बनाया का उपयोग कर, उस प्रारूप में है:
पायथन में, एक शब्दकोष में कीवर्ड जोड़े से युक्त सूची जोड़ने का सबसे आसान तरीका क्या है?

name:name2, name:name3, name2:name4, name3:name5\n (etc) 

मैं एक शब्दकोश में इन कीवर्ड जोड़े को जोड़ने के लिए तो कर रहा हूँ , जो हिस्सा मैं फंस गया हूं।
कोड मैं अब तक है यह है:

dictionary = dict() 
database = open('names.dat', 'r') 
data = database.read() 
data = data.rstrip('\n') 
data = data.split(',') 
for item in range(len(data)): 
    dictionary.update(data[item-1]) 

मेरे सोच जा रहा है कि अगर मैं प्रारूप में एक सूची तत्व है "नाम: NAME2", और मैं एक के रूप में उस तत्व के साथ शब्दकोश अद्यतन फ़ंक्शन को कॉल करें तर्क, यह शब्दकोश में एक कीवर्ड जोड़ी के लिए ठीक से मानचित्र करेगा।
बहरहाल, यह मामला नहीं है, जब मैं इस स्क्रिप्ट को चलाने के रूप में मैं इस त्रुटि मिलती है:

File "MyName.py", line 7, in <module> 
    dictionary.update(data[item-1]) 
ValueError: dictionary update sequence element #0 has length 1; 2 is required 

This और This समान लगते हैं, लेकिन मुझे लगता है कि यह एक अलग वारंट एक अलग प्रश्न के लिए पर्याप्त है प्रतिक्रिया।
मैं यहां क्या गलत कर रहा हूं, और मैं इसे कैसे ठीक कर सकता हूं?
क्या ऐसा करने का कोई आसान तरीका है? आपकी फ़ाइल है

data = [] 
with open('names.dat') as database: 
    for line in database: 
     if line.strip(): # skip blank lines 
      data.append(
       dict(i.split(":") for i in line.rstrip('\n').split(",")) 
      ) 

:

उत्तर

5

@Paulo Scardine एक महान जवाब है आप दी गई csv से एक सटीक डाटासेट बनाना चाहते हैं। आप कुंजी एक इस्तेमाल कर सकते हैं इस के आधार पर मान गठबंधन करना चाहते हैं:

changes = {} 
with open('test.csv', 'r') as f: 
    for row in f: 
     for e in row.rstrip('\n').split(", ") : #split lines by column 
      print (e) #just to show what is being generated here 
      (k,v) = e.split(":") #split further into key, value pairs 
      changes.setdefault(k, []).append(v) 
      #creates empty list if new key, adds value to list 

print (changes) 

डाटा तरह दिखेगा:

{'name3': ['name5'], 'name2': ['name4', 'name6', 'name5'], 'name1': ['name', 'name4'], 'name': ['name2', 'name3']} 

यह आगे सरलीकृत किया जा सकता है, लेकिन मैं यह अच्छा उदाहरण है कि देता है लगता है कि किसी सीखना पालन कर सकते हैं।

संपादित करें: जोड़ा SetDefault विधि निम्नलिखित @Paulo Scardine टिप्पणी

+1

यह मुहावरा अजगर में इतना आम है इसके लिए कुछ वाक्य रचना चीनी है कि वहाँ: 'dict.setdefault' और' collections.defaultdict' देखते हैं। –

+0

नीट, मैं अपनी एआई कक्षा के लिए आर से पायथन तक जा रहा हूं और उन तरीकों से मुझे सड़क के साथ कुछ सिरदर्द बचा सकते हैं – JGreenwell

3

इस प्रयास करें

name:name2,name:name3,name2:name4,name3:name5 
name:name2,name:name3,name2:name4,name3:name5 
name:name2,name:name3,name2:name4,name3:name5 
name:name2,name:name3,name2:name4,name3:name5 

data हो जाएगा:

[{'name': 'name3', 'name2': 'name4', 'name3': 'name5'}, 
{'name': 'name3', 'name2': 'name4', 'name3': 'name5'}, 
{'name': 'name3', 'name2': 'name4', 'name3': 'name5'}, 
{'name': 'name3', 'name2': 'name4', 'name3': 'name5'}] 

शायद आप list के dict के list के बजाय चाहते हैं dict:

data = {} 
with open('names.dat') as database: 
    for line in database: 
     if line.strip(): # skip blank lines 
      for k, v in (i.split(":") for i in line.rstrip('\n').split(",")): 
       data.setdefault(k, []).append(v) 

परिणामस्वरूप:

{'name': [ 'name2', 'name3', 'name2', 'name3', 'name2', 'name3', 'name2', 'name3'], 
'name2': ['name4', 'name4', 'name4', 'name4'], 
'name3': ['name5', 'name5', 'name5', 'name5']} 
संबंधित मुद्दे

 संबंधित मुद्दे