2013-05-04 9 views
5

शब्दकोश पर एक सूची कन्वर्ट करने के लिए मैं सबसे कारगर तरीका एक शब्दकोश में निम्न सूची में परिवर्तित करने में मदद की जरूरत है:कुशल तरीका

l = ['A:1','B:2','C:3','D:4'] 

वर्तमान में, मैं निम्नलिखित है:

mydict = {} 
for e in l: 
    k,v = e.split(':') 
    mydict[k] = v 

हालांकि, मुझे विश्वास है कि इसे प्राप्त करने के लिए एक और अधिक प्रभावी तरीका होना चाहिए। कोई उपाय ?

+4

मेरा मानना ​​है कि वहाँ है कि तुलना में अधिक कुशल कुछ भी नहीं है। याद रखें कि "कम लाइनें" "तेज" जैसी नहीं है। यह सब उबालता है कि भाषा उन पंक्तियों को कैसे फैलती है। – LtWorf

+0

मेरा तुलना उत्तर अद्यतन किया गया है, जो छोटे (4 आइटम), लंबे (13312 आइटम) और बहुत लंबे (27262976 आइटम) सूचियों के लिए संबंधित उत्तरों की तुलना करता है। – FallenAngel

उत्तर

12

एक जनरेटर अभिव्यक्ति के साथ प्रयोग के dict():

>>> lis=['A:1','B:2','C:3','D:4'] 
>>> dict(x.split(":") for x in lis) 
{'A': '1', 'C': '3', 'B': '2', 'D': '4'} 

(के रूप में @PaoloMoretti ने सुझाव दिया) dict-समझ का उपयोग करना:

>>> from so import * 
>>> %timeit case1() 
1 loops, best of 3: 2.09 s per loop 
>>> %timeit case2() 
1 loops, best of 3: 2.03 s per loop 
>>> %timeit case3() 
1 loops, best of 3: 2.17 s per loop 
>>> %timeit case4() 
1 loops, best of 3: 2.39 s per loop 
>>> %timeit case5() 
1 loops, best of 3: 2.82 s per loop 
: 10 ** 6 मदों के लिए

>>> {k:v for k,v in (e.split(':') for e in lis)} 
{'A': '1', 'C': '3', 'B': '2', 'D': '4'} 

समय परिणाम

so.py:

a = ["{0}:{0}".format(i**2) for i in xrange(10**6)] 

def case1(): 
    dc = {} 
    for i in a: 
     q, w = i.split(':') 
     dc[q]=w 

def case2(): 
    dict(x.split(":") for x in a) 


def case3(): 
    {k:v for k,v in (e.split(':') for e in a)} 

def case4(): 
    dict([x.split(":") for x in a]) 

def case5(): 
    {x.split(":")[0] : x.split(":")[1] for x in a} 
+0

@LtWorf 'x.split (": ") x में lis' के लिए जनरेटर अभिव्यक्ति है, एक सूची समझ नहीं है। इसलिए यह एक temrary डेटा संरचना आवंटित नहीं करता – Kos

+0

हाँ मेरी गलती, क्षमा करें। वैसे भी यह अधिक कुशल नहीं है। यह ऐसा ही है। – LtWorf

+1

@LtWorf इसे पढ़ें: http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Loops एलसी और जेनरेटर एक्सप्रेशन उनके बराबर 'लूप संस्करण' से तेज़ हैं। –

0

मैं यह उनके निष्पादन समय से तुलना करने के लिए बेहतर है लगता है ...

a = ['A:1','B:2','C:3','D:4'] 

def case1(): 
    dc = {} 
    for i in a: 
     q, w = i.split(':') 
     dc[q]=w 

def case2(): 
    dict(x.split(":") for x in a) 


def case3(): 
    {x.split(":")[0] : x.split(":")[1] for x in a} 


%timeit -n 100000 case1() 
>> 100000 loops, best of 3: 1.95 us per loop 


%timeit -n 100000 case2() 
>> 100000 loops, best of 3: 3.05 us per loop 


%timeit -n 100000 case3() 
>> 100000 loops, best of 3: 3.39 us per loop 

100.000 छोरों और प्रत्येक पाश के लिए 3 परीक्षण के लिए परीक्षण किया गया। ; जैसा कि आप देख सकते हैं, सबसे तेज़ निष्पादन समय case1() से संबंधित है: मानक for loop

परिणाम: 1 लाइनर विधियों का यह मतलब नहीं है कि वे तेज़ हैं, वास्तव में, मूल for लूप आमतौर पर जाने का सबसे तेज़ तरीका है।

अद्यतन: 13312 वस्तुओं की सूची के लिए परिणाम, मूल सूची में 26 आइटम हैं, शेष सूची में उन वस्तुओं की प्रतियां हैं। समय प्रत्येक पाश

%timeit -n 1000 case3() 
1000 loops, best of 3: 9.49 ms per loop 

%timeit -n 1000 case2() 
1000 loops, best of 3: 5.79 ms per loop 

%timeit -n 1000 case1() 
1000 loops, best of 3: 5.55 ms per loop 

अद्यतन 2 के लिए 1000 छोरों की गणना और 3 का सबसे अच्छा है: अंतिम परीक्षण 27262976 कुल मदों की एक सूची के साथ होता है, बुनियादी सूची 26 आइटम नहीं हैं, बाकी उन मदों की प्रतियां हैं सूची में wtihin। समय की गणना प्रत्येक लूप के लिए 10 लूप और 3 में से अधिक की गणना की जाती है (क्योंकि बहुत लंबी सूची के निष्पादन में काफी समय लगता है)।

%timeit -n 10 case1() 
10 loops, best of 3: 11.4 s per loop 

%timeit -n 10 case2() 
10 loops, best of 3: 12.1 s per loop 

%timeit -n 10 case3() 
10 loops, best of 3: 20.2 s per loop 
+0

लेकिन लगभग सभी अनुप्रयोगों के लिए मैं अभी भी केस 2 पसंद करूंगा क्योंकि यह और अधिक स्पष्ट है कि आप क्या कर रहे हैं। – poke

+0

क्या आपके पास एक बड़े डेटासेट के लिए कुछ परिणाम भी हैं? – inf

+0

@ पोक शायद, लेकिन यहां सवाल है _efficiency_, पठनीयता नहीं। – FallenAngel

1
>>> dict(map(lambda s: s.split(":"), ["A:1", "B:2", "C:3", "D:4"])) 
{'A': '1', 'C': '3', 'B': '2', 'D': '4'} 
संबंधित मुद्दे